diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/META-INF/context.xml b/tomcat-7.0.42/webapps/marketplace-portlet/META-INF/context.xml
deleted file mode 100644
index c904d2d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/META-INF/context.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<Context
-	antiJARLocking="true"
-	antiResourceLocking="true"
-/>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/base-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/base-spring.xml
deleted file mode 100644
index 8e5edba..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/base-spring.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	xmlns="http://www.springframework.org/schema/beans"
-	xmlns:aop="http://www.springframework.org/schema/aop"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
->
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.aop.ServiceBeanAutoProxyCreator" />
-		<constructor-arg>
-			<map>
-				<entry key="beanMatcher">
-					<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-						<constructor-arg value="com.liferay.portal.spring.aop.ServiceBeanMatcher" />
-					</bean>
-				</entry>
-				<entry key="methodInterceptor" value-ref="serviceAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.bean.BeanReferenceAnnotationBeanPostProcessor" />
-	</bean>
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.context.PortletBeanFactoryCleaner" />
-	</bean>
-	<bean id="portletClassLoader" class="com.liferay.portal.kernel.portlet.PortletClassLoaderUtil" factory-method="getClassLoader" />
-	<bean id="servletContextName" class="com.liferay.portal.kernel.portlet.PortletClassLoaderUtil" factory-method="getServletContextName" />
-	<bean id="basePersistence" abstract="true">
-		<property name="dataSource" ref="liferayDataSource" />
-		<property name="sessionFactory" ref="liferaySessionFactory" />
-	</bean>
-	<bean id="serviceAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.aop.SkipAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="accessControlAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="accessControlAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.security.ac.AccessControlAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="accessControlAdvisor">
-					<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-						<constructor-arg value="com.liferay.portal.security.ac.AccessControlAdvisorImpl" />
-					</bean>
-				</entry>
-				<entry key="nextMethodInterceptor" value-ref="portalResiliencyAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="portalResiliencyAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.resiliency.service.PortalResiliencyAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="serviceMonitorAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="serviceMonitorAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.monitoring.statistics.service.ServiceMonitorAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="asyncAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="asyncAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.messaging.async.AsyncAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="defaultDestinationName" value="liferay/async_service" />
-				<entry key="nextMethodInterceptor" value-ref="threadLocalCacheAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="threadLocalCacheAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.cache.ThreadLocalCacheAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="bufferedIncrementAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="bufferedIncrementAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.increment.BufferedIncrementAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="indexableAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="indexableAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.search.IndexableAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="systemEventAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="systemEventAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.systemevent.SystemEventAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="transactionAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="transactionAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.transaction.TransactionInterceptorFactoryBean" />
-		<constructor-arg>
-			<map>
-				<entry key="platformTransactionManager" value-ref="liferayTransactionManager" />
-				<entry key="transactionAttributeSource" value-ref="transactionAttributeSource" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="transactionAttributeSource" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.transaction.AnnotationTransactionAttributeSource" />
-	</bean>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/cluster-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/cluster-spring.xml
deleted file mode 100644
index cd5219b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/cluster-spring.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	xmlns="http://www.springframework.org/schema/beans"
-	xmlns:util="http://www.springframework.org/schema/util"
-	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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"
->
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.cluster.ClusterableChainableMethodAdviceInjector" />
-		<constructor-arg>
-			<map>
-				<entry key="parentChainableMethodAdvice" value-ref="serviceAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/hibernate-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/hibernate-spring.xml
deleted file mode 100644
index 27564a2..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/hibernate-spring.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	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="liferayHibernateSessionFactory" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.hibernate.PortletHibernateConfiguration" />
-		<constructor-arg>
-			<map>
-				<entry key="dataSource" value-ref="liferayDataSource" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="liferaySessionFactory" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.dao.orm.hibernate.PortletSessionFactoryImpl" />
-		<constructor-arg>
-			<map>
-				<entry key="dataSource" value-ref="liferayDataSource" />
-				<entry key="sessionFactoryClassLoader" value-ref="portletClassLoader" />
-				<entry key="sessionFactoryImplementor" value-ref="liferayHibernateSessionFactory" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="liferayTransactionManager" class="com.liferay.portal.kernel.util.InfrastructureUtil" factory-method="getTransactionManager" />
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/infrastructure-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/infrastructure-spring.xml
deleted file mode 100644
index 380d697..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/infrastructure-spring.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	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="liferayDataSource" class="com.liferay.portal.kernel.util.InfrastructureUtil" factory-method="getDataSource" />
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/javadocs-all.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/javadocs-all.xml
deleted file mode 100644
index 7d84c2c..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/javadocs-all.xml
+++ /dev/null
@@ -1,1451 +0,0 @@
-<?xml version="1.0"?>
-
-<javadocs>
-	<javadoc>
-		<name>AppManagerControlPanelEntry</name>
-		<type>com.liferay.marketplace.appmanager.portlet.AppManagerControlPanelEntry</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>hasAccessPermission</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>group</name>
-				<type>com.liferay.portal.model.Group</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>portlet</name>
-				<type>com.liferay.portal.model.Portlet</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>AppManagerPortlet</name>
-		<type>com.liferay.marketplace.appmanager.portlet.AppManagerPortlet</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updatePluginSetting</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updatePluginSettings</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>doInstallRemoteApp</name>
-			<param>
-				<name>url</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>uploadPortletRequest</name>
-				<type>com.liferay.portal.kernel.upload.UploadPortletRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>failOnError</name>
-				<type>boolean</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>doInstallSourceForgeApp</name>
-			<param>
-				<name>path</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>uploadPortletRequest</name>
-				<type>com.liferay.portal.kernel.upload.UploadPortletRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>DEPLOY_TO_PREFIX</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>StartupAction</name>
-		<type>com.liferay.marketplace.hook.events.StartupAction</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>run</name>
-			<param>
-				<name>ids</name>
-				<type>java.lang.String[]</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>ActionException</name>
-				<type>com.liferay.portal.kernel.events.ActionException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>doRun</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>UpgradeProcess_1_0_0</name>
-		<type>com.liferay.marketplace.hook.upgrade.UpgradeProcess_1_0_0</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>getThreshold</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>doUpgrade</name>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>UpgradeExpando</name>
-		<type>com.liferay.marketplace.hook.upgrade.v1_0_0.UpgradeExpando</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>doUpgrade</name>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateMPExpandoColumns</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>HotDeployMessageListener</name>
-		<type>com.liferay.marketplace.messaging.HotDeployMessageListener</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>doReceive</name>
-			<param>
-				<name>message</name>
-				<type>com.liferay.portal.kernel.messaging.Message</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>MarketplaceMessageListener</name>
-		<type>com.liferay.marketplace.messaging.MarketplaceMessageListener</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>doReceive</name>
-			<param>
-				<name>message</name>
-				<type>com.liferay.portal.kernel.messaging.Message</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>AppImpl</name>
-		<type>com.liferay.marketplace.model.impl.AppImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>AppImpl</name>
-		</method>
-		<method>
-			<name>addContextName</name>
-			<param>
-				<name>contextName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getContextNames</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getFileDir</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getFileName</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getFilePath</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>isDownloaded</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>isInstalled</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>_DIR_NAME</name>
-		</field>
-		<field>
-			<name>_EXTENSION</name>
-		</field>
-		<field>
-			<name>_contextNames</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>ModuleImpl</name>
-		<type>com.liferay.marketplace.model.impl.ModuleImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>ModuleImpl</name>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>AppLocalServiceImpl</name>
-		<type>com.liferay.marketplace.service.impl.AppLocalServiceImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>clearInstalledAppsCache</name>
-		</method>
-		<method>
-			<name>deleteApp</name>
-			<param>
-				<name>app</name>
-				<type>com.liferay.marketplace.model.App</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>deleteApp</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>fetchRemoteApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getApps</name>
-			<param>
-				<name>category</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getBundledApps</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getInstalledApps</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>processMarketplaceProperties</name>
-			<param>
-				<name>properties</name>
-				<type>java.util.Properties</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>file</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>title</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>description</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>category</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>iconURL</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>file</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getContextName</name>
-			<param>
-				<name>fileName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getMarketplaceProperties</name>
-			<param>
-				<name>liferayPackageFile</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>hasDependentApp</name>
-			<param>
-				<name>module</name>
-				<type>com.liferay.marketplace.model.Module</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>validate</name>
-			<param>
-				<name>title</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>_log</name>
-		</field>
-		<field>
-			<name>_bundledApps</name>
-		</field>
-		<field>
-			<name>_installedApps</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>AppServiceImpl</name>
-		<type>com.liferay.marketplace.service.impl.AppServiceImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>deleteApp</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>file</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>ModuleLocalServiceImpl</name>
-		<type>com.liferay.marketplace.service.impl.ModuleLocalServiceImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>addModule</name>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>contextName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>fetchModule</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>contextName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getModules</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>MarketplacePermission</name>
-		<type>com.liferay.marketplace.service.permission.MarketplacePermission</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>check</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>contains</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>StoreControlPanelEntry</name>
-		<type>com.liferay.marketplace.store.portlet.StoreControlPanelEntry</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>hasAccessPermission</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>group</name>
-				<type>com.liferay.portal.model.Group</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>portlet</name>
-				<type>com.liferay.portal.model.Portlet</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>StorePortlet</name>
-		<type>com.liferay.marketplace.store.portlet.StorePortlet</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>downloadApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getBundledApps</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getClientId</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>processAction</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>IOException</name>
-				<type>java.io.IOException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateClientId</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>callActionMethod</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortletException</name>
-				<type>javax.portlet.PortletException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getAppJSONObject</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getRemoteAppPackageURL</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>token</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>url</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>_PORTLET_NAMESPACE</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>MarketplaceConstants</name>
-		<type>com.liferay.marketplace.util.MarketplaceConstants</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>getPathPurchased</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getPathStore</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<field>
-			<name>MARKETPLACE_URL_LOGOUT</name>
-		</field>
-		<field>
-			<name>_MARKETPLACE_CLIENT_BUILD</name>
-		</field>
-		<field>
-			<name>_MARKETPLACE_PATH_PURCHASED</name>
-		</field>
-		<field>
-			<name>_MARKETPLACE_PATH_STORE</name>
-		</field>
-		<field>
-			<name>_pathPurchased</name>
-		</field>
-		<field>
-			<name>_pathStore</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>MarketplaceUtil</name>
-		<type>com.liferay.marketplace.util.MarketplaceUtil</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>decodeClientId</name>
-			<param>
-				<name>encodedClientId</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>token</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>encodeClientId</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>token</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>hasMarketplaceAdmin</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>isMarketplaceAdmin</name>
-			<param>
-				<name>user</name>
-				<type>com.liferay.portal.model.User</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>xor</name>
-			<param>
-				<name>bytes1</name>
-				<type>byte[]</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>bytes2</name>
-				<type>byte[]</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>PortletKeys</name>
-		<type>com.liferay.marketplace.util.PortletKeys</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<field>
-			<name>MY_MARKETPLACE</name>
-		</field>
-		<field>
-			<name>STORE</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>PortletPropsKeys</name>
-		<type>com.liferay.marketplace.util.PortletPropsKeys</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<field>
-			<name>MARKETPLACE_STORE_ENABLED</name>
-		</field>
-		<field>
-			<name>MARKETPLACE_URL_LOGOUT</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>PortletPropsValues</name>
-		<type>com.liferay.marketplace.util.PortletPropsValues</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<field>
-			<name>MARKETPLACE_STORE_ENABLED</name>
-		</field>
-		<field>
-			<name>MARKETPLACE_URL_LOGOUT</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>AppTitleComparator</name>
-		<type>com.liferay.marketplace.util.comparator.AppTitleComparator</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>AppTitleComparator</name>
-		</method>
-		<method>
-			<name>AppTitleComparator</name>
-			<param>
-				<name>asc</name>
-				<type>boolean</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-		</method>
-		<method>
-			<name>compare</name>
-			<param>
-				<name>obj1</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>obj2</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getOrderBy</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getOrderByFields</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>isAscending</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<field>
-			<name>ORDER_BY_ASC</name>
-		</field>
-		<field>
-			<name>ORDER_BY_DESC</name>
-		</field>
-		<field>
-			<name>ORDER_BY_FIELDS</name>
-		</field>
-		<field>
-			<name>_asc</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>PluginComparator</name>
-		<type>com.liferay.marketplace.util.comparator.PluginComparator</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>PluginComparator</name>
-		</method>
-		<method>
-			<name>PluginComparator</name>
-			<param>
-				<name>servletContext</name>
-				<type>javax.servlet.ServletContext</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>locale</name>
-				<type>java.util.Locale</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-		</method>
-		<method>
-			<name>compare</name>
-			<param>
-				<name>plugin1</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>plugin2</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>_getName</name>
-			<param>
-				<name>plugin</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<field>
-			<name>_locale</name>
-		</field>
-		<field>
-			<name>_servletContext</name>
-		</field>
-	</javadoc>
-</javadocs>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/javadocs-rt.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/javadocs-rt.xml
deleted file mode 100644
index 48342ae..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/javadocs-rt.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<javadocs><javadoc><name>AppLocalServiceImpl</name><type>com.liferay.marketplace.service.impl.AppLocalServiceImpl</type><author><![CDATA[Ryan Park]]></author><method><name>clearInstalledAppsCache</name></method><method><name>deleteApp</name><param><name>app</name><type>com.liferay.marketplace.model.App</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>deleteApp</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>fetchRemoteApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getApps</name><param><name>category</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getBundledApps</name><return><comment><![CDATA[]]></comment></return></method><method><name>getInstalledApps</name><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>installApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>processMarketplaceProperties</name><param><name>properties</name><type>java.util.Properties</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>uninstallApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>updateApp</name><param><name>userId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>file</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>updateApp</name><param><name>userId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>title</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>description</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>category</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>iconURL</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>file</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getContextName</name><param><name>fileName</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return></method><method><name>getMarketplaceProperties</name><param><name>liferayPackageFile</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return></method><method><name>hasDependentApp</name><param><name>module</name><type>com.liferay.marketplace.model.Module</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>validate</name><param><name>title</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><field><name>_log</name></field><field><name>_bundledApps</name></field><field><name>_installedApps</name></field></javadoc><javadoc><name>AppServiceImpl</name><type>com.liferay.marketplace.service.impl.AppServiceImpl</type><author><![CDATA[Ryan Park]]></author><method><name>deleteApp</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>installApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>uninstallApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>updateApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>file</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method></javadoc><javadoc><name>ModuleLocalServiceImpl</name><type>com.liferay.marketplace.service.impl.ModuleLocalServiceImpl</type><author><![CDATA[Ryan Park]]></author><method><name>addModule</name><param><name>userId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>contextName</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>fetchModule</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>contextName</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getModules</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method></javadoc></javadocs>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/messaging-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/messaging-spring.xml
deleted file mode 100644
index cfc66a5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/messaging-spring.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	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"
->
-
-	<!-- Listeners -->
-
-	<bean id="messageListener.hot_deploy" class="com.liferay.marketplace.messaging.HotDeployMessageListener" />
-	<bean id="messageListener.marketplace" class="com.liferay.marketplace.messaging.MarketplaceMessageListener" />
-
-	<!-- Configurator -->
-
-	<bean id="messagingConfigurator" class="com.liferay.portal.kernel.messaging.config.PluginMessagingConfigurator">
-		<property name="messageListeners">
-			<map key-type="java.lang.String" value-type="java.util.List">
-				<entry key="liferay/hot_deploy">
-					<list value-type="com.liferay.portal.kernel.messaging.MessageListener">
-						<ref bean="messageListener.hot_deploy" />
-					</list>
-				</entry>
-				<entry key="liferay/marketplace">
-					<list value-type="com.liferay.portal.kernel.messaging.MessageListener">
-						<ref bean="messageListener.marketplace" />
-					</list>
-				</entry>
-			</map>
-		</property>
-	</bean>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-hbm.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-hbm.xml
deleted file mode 100644
index cea6660..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-hbm.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping default-lazy="false" auto-import="false">
-	<import class="com.liferay.marketplace.model.App" />
-	<import class="com.liferay.marketplace.model.Module" />
-	<class name="com.liferay.marketplace.model.impl.AppImpl" table="Marketplace_App">
-		<cache usage="read-write" />
-		<id name="appId" type="long">
-			<generator class="assigned" />
-		</id>
-		<property name="uuid" type="com.liferay.portal.dao.orm.hibernate.StringType" column="uuid_" />
-		<property name="companyId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="userId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="userName" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="createDate" type="org.hibernate.type.TimestampType" />
-		<property name="modifiedDate" type="org.hibernate.type.TimestampType" />
-		<property name="remoteAppId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="title" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="description" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="category" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="iconURL" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="version" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-	</class>
-	<class name="com.liferay.marketplace.model.impl.ModuleImpl" table="Marketplace_Module">
-		<cache usage="read-write" />
-		<id name="moduleId" type="long">
-			<generator class="assigned" />
-		</id>
-		<property name="uuid" type="com.liferay.portal.dao.orm.hibernate.StringType" column="uuid_" />
-		<property name="appId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="contextName" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-	</class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-model-hints.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-model-hints.xml
deleted file mode 100644
index 270df20..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-model-hints.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-
-<model-hints>
-	<model name="com.liferay.marketplace.model.App">
-		<field name="uuid" type="String" />
-		<field name="appId" type="long" />
-		<field name="companyId" type="long" />
-		<field name="userId" type="long" />
-		<field name="userName" type="String" />
-		<field name="createDate" type="Date" />
-		<field name="modifiedDate" type="Date" />
-		<field name="remoteAppId" type="long" />
-		<field name="title" type="String" />
-		<field name="description" type="String">
-			<hint-collection name="TEXTAREA" />
-		</field>
-		<field name="category" type="String" />
-		<field name="iconURL" type="String">
-			<hint-collection name="URL" />
-		</field>
-		<field name="version" type="String" />
-	</model>
-	<model name="com.liferay.marketplace.model.Module">
-		<field name="uuid" type="String" />
-		<field name="moduleId" type="long" />
-		<field name="appId" type="long" />
-		<field name="contextName" type="String" />
-	</model>
-</model-hints>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-orm.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-orm.xml
deleted file mode 100644
index d321672..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-orm.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-
-<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
-	<persistence-unit-metadata>
-		<xml-mapping-metadata-complete/>
-		<persistence-unit-defaults>
-			<access>PROPERTY</access>
-		</persistence-unit-defaults>
-	</persistence-unit-metadata>
-	<mapped-superclass class="com.liferay.marketplace.model.impl.AppModelImpl">
-		<attributes>
-			<id name="appId" />
-			<basic name="uuid">
-				<column name="UUID_" />
-			</basic>
-			<basic name="companyId" />
-			<basic name="userId" />
-			<basic name="userName" />
-			<basic name="createDate">
-				<temporal>TIMESTAMP</temporal>
-			</basic>
-			<basic name="modifiedDate">
-				<temporal>TIMESTAMP</temporal>
-			</basic>
-			<basic name="remoteAppId" />
-			<basic name="title" />
-			<basic name="description" />
-			<basic name="category" />
-			<basic name="iconURL" />
-			<basic name="version" />
-			<transient name="modelAttributes" />
-			<transient name="primaryKey" />
-			<transient name="primaryKeyObj" />
-			<transient name="userUuid" />
-		</attributes>
-	</mapped-superclass>
-	<mapped-superclass class="com.liferay.marketplace.model.impl.ModuleModelImpl">
-		<attributes>
-			<id name="moduleId" />
-			<basic name="uuid">
-				<column name="UUID_" />
-			</basic>
-			<basic name="appId" />
-			<basic name="contextName" />
-			<transient name="modelAttributes" />
-			<transient name="primaryKey" />
-			<transient name="primaryKeyObj" />
-		</attributes>
-	</mapped-superclass>
-	<entity class="com.liferay.marketplace.model.impl.AppImpl" name="App">
-		<table name="Marketplace_App" />
-		<attributes />
-	</entity>
-	<entity class="com.liferay.marketplace.model.impl.ModuleImpl" name="Module">
-		<table name="Marketplace_Module" />
-		<attributes />
-	</entity>
-</entity-mappings>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-spring.xml
deleted file mode 100644
index bee5c19..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/portlet-spring.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-
-<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" default-destroy-method="destroy" default-init-method="afterPropertiesSet" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-	<bean id="com.liferay.marketplace.service.AppLocalService" class="com.liferay.marketplace.service.impl.AppLocalServiceImpl" />
-	<bean id="com.liferay.marketplace.service.AppService" class="com.liferay.marketplace.service.impl.AppServiceImpl" />
-	<bean id="com.liferay.marketplace.service.persistence.AppPersistence" class="com.liferay.marketplace.service.persistence.AppPersistenceImpl" parent="basePersistence" />
-	<bean id="com.liferay.marketplace.service.ModuleLocalService" class="com.liferay.marketplace.service.impl.ModuleLocalServiceImpl" />
-	<bean id="com.liferay.marketplace.service.persistence.ModulePersistence" class="com.liferay.marketplace.service.persistence.ModulePersistenceImpl" parent="basePersistence" />
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/shard-data-source-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/shard-data-source-spring.xml
deleted file mode 100644
index fe293f4..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/META-INF/shard-data-source-spring.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	xmlns="http://www.springframework.org/schema/beans"
-	xmlns:aop="http://www.springframework.org/schema/aop"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
->
-	<bean id="com.liferay.portal.dao.shard.advice.ShardAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.dao.shard.advice.ShardAdvice" />
-	</bean>
-	<bean id="com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="shardAdvice" value-ref="com.liferay.portal.dao.shard.advice.ShardAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<aop:config proxy-target-class="false">
-		<aop:advisor advice-ref="com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice" pointcut="bean(*Persistence) || bean(*Finder)" />
-	</aop:config>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/appmanager/portlet/AppManagerControlPanelEntry.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/appmanager/portlet/AppManagerControlPanelEntry.class
deleted file mode 100644
index 5235d20..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/appmanager/portlet/AppManagerControlPanelEntry.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/appmanager/portlet/AppManagerPortlet.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/appmanager/portlet/AppManagerPortlet.class
deleted file mode 100644
index 23a0a6f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/appmanager/portlet/AppManagerPortlet.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/events/StartupAction.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/events/StartupAction.class
deleted file mode 100644
index 8b69e95..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/events/StartupAction.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/upgrade/UpgradeProcess_1_0_0.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/upgrade/UpgradeProcess_1_0_0.class
deleted file mode 100644
index b8685c5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/upgrade/UpgradeProcess_1_0_0.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/upgrade/v1_0_0/UpgradeExpando.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/upgrade/v1_0_0/UpgradeExpando.class
deleted file mode 100644
index e2e9537..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/hook/upgrade/v1_0_0/UpgradeExpando.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/messaging/HotDeployMessageListener.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/messaging/HotDeployMessageListener.class
deleted file mode 100644
index e68b46d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/messaging/HotDeployMessageListener.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/messaging/MarketplaceMessageListener.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/messaging/MarketplaceMessageListener.class
deleted file mode 100644
index cf24f18..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/messaging/MarketplaceMessageListener.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppBaseImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppBaseImpl.class
deleted file mode 100644
index ac74f1b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppBaseImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppCacheModel.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppCacheModel.class
deleted file mode 100644
index cc0da61..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppCacheModel.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppImpl.class
deleted file mode 100644
index 4f41a94..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppModelImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppModelImpl.class
deleted file mode 100644
index 2473d2f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/AppModelImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleBaseImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleBaseImpl.class
deleted file mode 100644
index c49ab52..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleBaseImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleCacheModel.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleCacheModel.class
deleted file mode 100644
index ca00bd5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleCacheModel.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleImpl.class
deleted file mode 100644
index 8f485c1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleModelImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleModelImpl.class
deleted file mode 100644
index 8cd1470..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/model/impl/ModuleModelImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppLocalServiceBaseImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppLocalServiceBaseImpl.class
deleted file mode 100644
index 4061171..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppLocalServiceBaseImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppLocalServiceClpInvoker.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppLocalServiceClpInvoker.class
deleted file mode 100644
index d5028b2..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppLocalServiceClpInvoker.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppServiceBaseImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppServiceBaseImpl.class
deleted file mode 100644
index f0a0b2d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppServiceBaseImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppServiceClpInvoker.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppServiceClpInvoker.class
deleted file mode 100644
index 6525b33..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/AppServiceClpInvoker.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/ModuleLocalServiceBaseImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/ModuleLocalServiceBaseImpl.class
deleted file mode 100644
index 5083afb..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/ModuleLocalServiceBaseImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/ModuleLocalServiceClpInvoker.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/ModuleLocalServiceClpInvoker.class
deleted file mode 100644
index 5ee8bfb..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/base/ModuleLocalServiceClpInvoker.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/http/AppServiceSoap.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/http/AppServiceSoap.class
deleted file mode 100644
index 37188c0..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/http/AppServiceSoap.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/AppLocalServiceImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/AppLocalServiceImpl.class
deleted file mode 100644
index 3d18432..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/AppLocalServiceImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/AppServiceImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/AppServiceImpl.class
deleted file mode 100644
index d093a54..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/AppServiceImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/ModuleLocalServiceImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/ModuleLocalServiceImpl.class
deleted file mode 100644
index 772e5de..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/impl/ModuleLocalServiceImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/permission/MarketplacePermission.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/permission/MarketplacePermission.class
deleted file mode 100644
index c19dd95..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/permission/MarketplacePermission.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl$1.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl$1.class
deleted file mode 100644
index a3c95ab..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl$1.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl$2.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl$2.class
deleted file mode 100644
index 3587c10..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl$2.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl.class
deleted file mode 100644
index 201ba03..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/AppPersistenceImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl$1.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl$1.class
deleted file mode 100644
index 7188299..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl$1.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl$2.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl$2.class
deleted file mode 100644
index 3f6cc36..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl$2.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl.class
deleted file mode 100644
index 60a93d6..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/service/persistence/ModulePersistenceImpl.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/store/portlet/StoreControlPanelEntry.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/store/portlet/StoreControlPanelEntry.class
deleted file mode 100644
index 35acb8e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/store/portlet/StoreControlPanelEntry.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/store/portlet/StorePortlet.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/store/portlet/StorePortlet.class
deleted file mode 100644
index 4d484cd..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/store/portlet/StorePortlet.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/MarketplaceConstants.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/MarketplaceConstants.class
deleted file mode 100644
index 7a1079d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/MarketplaceConstants.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/MarketplaceUtil.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/MarketplaceUtil.class
deleted file mode 100644
index 920359b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/MarketplaceUtil.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletKeys.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletKeys.class
deleted file mode 100644
index 6a4d5b6..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletKeys.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletPropsKeys.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletPropsKeys.class
deleted file mode 100644
index 447d568..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletPropsKeys.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletPropsValues.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletPropsValues.class
deleted file mode 100644
index aca9109..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/PortletPropsValues.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/comparator/AppTitleComparator.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/comparator/AppTitleComparator.class
deleted file mode 100644
index 34cc0d8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/comparator/AppTitleComparator.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/comparator/PluginComparator.class b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/comparator/PluginComparator.class
deleted file mode 100644
index 3901e8b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/com/liferay/marketplace/util/comparator/PluginComparator.class
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language.properties
deleted file mode 100644
index dfdbaa5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps
-app-manager=App Manager
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this?
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product?
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager
-reindex-search=Reindex Search
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app.
-this-app-contains=This app contains:
-this-portlet-is-available-in-my-account=This portlet is available in My Account.
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration.
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ar.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ar.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ar.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_bg.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_bg.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_bg.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ca.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ca.properties
deleted file mode 100644
index ce77923..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ca.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Totes les aplicacions
-app-manager=Gestor de aplicacions
-are-you-sure-you-want-to-uninstall-this=Esteu segur que voleu desinstal·lar aquesta aplicació?
-are-you-sure-you-want-to-uninstall-this-product=Esteu segur que voleu desinstal·lar aquest producte?
-could-not-connect-to-the-liferay-marketplace=No s'ha pogut connectar amb el Marketplace de Liferay.
-file-upload-lpkg-or-war-file=Càrrega de fitxer (LPKG o WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Les aplicacions instal·lades estan disponibles totes les instàncies de portal. Aneu a la configuració de connectors dins de cada instància de portal per a activar/desactivar cada aplicació.
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Gestor de aplicacions
-reindex-search=Reindexa la cerca
-there-are-no-configurable-plugins-for-this-app=No hi ha connectors configurables per a aquesta aplicació.
-this-app-contains=Aquesta aplicació conté:
-this-portlet-is-available-in-my-account=Aquest mòdul de portal està disponible en El teu compte.
-this-portlet-is-available-in-site-administration=Aquest mòdul de portal està disponible en l'Administració del lloc.
-this-portlet-is-available-in-the-control-panel=Aquest mòdul de portal està disponible en el tauler de control.
-unable-to-uninstall-app-or-plugin-because-it-is-required=No s'ha pogut desinstal·lar la aplicació o connector perquè es requereix.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_cs.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_cs.properties
deleted file mode 100644
index 4d29d5e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_cs.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Všechny aplikace
-app-manager=Správce aplikací
-are-you-sure-you-want-to-uninstall-this=Opravdu si přejete odinstalovat tento produkt?
-are-you-sure-you-want-to-uninstall-this-product=Opravdu si přejete odinstalovat tento produkt?
-could-not-connect-to-the-liferay-marketplace=Nepodařilo se připojit do Lifery Marketplace.
-file-upload-lpkg-or-war-file=Nahrání souboru (soubor typu LPKG nebo WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Správce aplikací
-reindex-search=Přeindexovat vyhledávání
-there-are-no-configurable-plugins-for-this-app=Pro tuto aplikaci zde nejsou žádné zásuvné moduly.
-this-app-contains=Tato aplikace obsahuje:
-this-portlet-is-available-in-my-account=Tento portlet je dostupný v sekci Můj účet.
-this-portlet-is-available-in-site-administration=Tento portlet je dostupný v sekci Správa webu.
-this-portlet-is-available-in-the-control-panel=Tento portlet je dostupný v sekci Ovládací panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Nepodařilo se odinstalovat aplikaci nebo zásuvný modul, protože je požadována.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_da.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_da.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_da.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_de.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_de.properties
deleted file mode 100644
index c7301c1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_de.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle Apps
-app-manager=App Manager
-are-you-sure-you-want-to-uninstall-this=Sind Sie sicher, dass Sie diese App deinstallieren möchten?
-are-you-sure-you-want-to-uninstall-this-product=Sind Sie sicher, dass Sie dieses Produkt deinstallieren möchten?
-could-not-connect-to-the-liferay-marketplace=Es konnte keine Verbindung zum Liferay Marketplace hergestellt werden.
-file-upload-lpkg-or-war-file=Datei hochladen (LPKG- oder WAR-Datei)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installierte Apps sind in allen Portalinstanzen verfügbar. Innerhalb der Portletkonfiguration der jeweiligen Instanz können Apps aktiviert oder deaktiviert werden.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Erworben
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager
-reindex-search=Suchindex neu erstellen
-there-are-no-configurable-plugins-for-this-app=Diese App beinhaltet keine konfigurierbaren Plugins.
-this-app-contains=Diese App beinhaltet:
-this-portlet-is-available-in-my-account=Dieses Portlet ist innerhalb von Mein Konto verfügbar.
-this-portlet-is-available-in-site-administration=Dieses Portlet ist innerhalb der Site-Administration verfügbar.
-this-portlet-is-available-in-the-control-panel=Dieses Portlet ist innerhalb des Kontrollbereichs verfügbar.
-unable-to-uninstall-app-or-plugin-because-it-is-required=App oder Plugin kann nicht deinstalliert werden, weil es benötigt wird.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_el.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_el.properties
deleted file mode 100644
index 46aac79..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_el.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Όλα τα Apps (Automatic Translation)
-app-manager=Διαχείριση εφαρμογών (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=Είστε βέβαιοι ότι θέλετε να απεγκαταστήσετε αυτό; (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=Είστε βέβαιοι εσείς θέλετε την απεγκατάσταση αυτό το προϊόν; (Automatic Translation)
-could-not-connect-to-the-liferay-marketplace=Δεν θα μπορούσε να συνδέσει με την αγορά Liferay. (Automatic Translation)
-file-upload-lpkg-or-war-file=Φορτώστε το αρχείο (LPKG ή ΠΌΛΕΜΟΣ αρχείο) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Εγκατεστημένη apps είναι διαθέσιμα σε όλες τις εμφανίσεις πύλης. Πηγαίνετε στο Plugins διαμόρφωση μέσα σε κάθε πύλη παράδειγμα για την ενεργοποίηση/απενεργοποίηση κάθε app. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=Κατάστημα (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Αγοράζονται (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Διαχείριση εφαρμογών (Automatic Translation)
-reindex-search=Αναπροσαρμόσετε Αναζήτηση (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=Υπάρχουν δεν διαμορφώσιμες plugins για αυτό το app. (Automatic Translation)
-this-app-contains=Αυτό το app που περιέχει: (Automatic Translation)
-this-portlet-is-available-in-my-account=Αυτό το portlet είναι διαθέσιμο στο λογαριασμό μου. (Automatic Translation)
-this-portlet-is-available-in-site-administration=Αυτό το portlet είναι διαθέσιμα στη διοίκηση του Site. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=Αυτό το portlet είναι διαθέσιμος στον πίνακα ελέγχου. (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Αδυνατεί να το απεγκαταστήσετε app ή το plugin, επειδή απαιτείται. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_en.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_en.properties
deleted file mode 100644
index dfdbaa5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_en.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps
-app-manager=App Manager
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this?
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product?
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager
-reindex-search=Reindex Search
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app.
-this-app-contains=This app contains:
-this-portlet-is-available-in-my-account=This portlet is available in My Account.
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration.
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_es.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_es.properties
deleted file mode 100644
index 09e65ed..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_es.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Todas las aplicaciones
-app-manager=Gestor de aplicaciones
-are-you-sure-you-want-to-uninstall-this=¿Está seguro de que desea desinstalar este producto?
-are-you-sure-you-want-to-uninstall-this-product=Está seguro de que desea desinstalar este producto?
-could-not-connect-to-the-liferay-marketplace=No se ha podido establecer la conexión con el Marketplace de Liferay.
-file-upload-lpkg-or-war-file=Cargar fichero (fichero LPKG o WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Las aplicaciones están disponibles para todas las instancias del portal. Ve a Configuración de Plugins en cada instancia para habilitar o deshablitar cada aplicación
-javax.portlet.title.1_WAR_marketplaceportlet=Tienda (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Comprar (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Gestor de aplicaciones
-reindex-search=Reindexar búsqueda
-there-are-no-configurable-plugins-for-this-app=No hay plugins disponibles para esta aplicación
-this-app-contains=Esta aplicación contiene:
-this-portlet-is-available-in-my-account=Este portlet está disponible en Mi Cuenta
-this-portlet-is-available-in-site-administration=Este portlet está disponible en Administración del Sitio
-this-portlet-is-available-in-the-control-panel=Este portlet está disponible en el Panel de Control
-unable-to-uninstall-app-or-plugin-because-it-is-required=No se permite desinstalar la aplicación porque es requerida
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_et.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_et.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_et.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_eu.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_eu.properties
deleted file mode 100644
index 6158169..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_eu.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Ziur al zaude produktu hau desinstalatu nahi duzula?
-are-you-sure-you-want-to-uninstall-this-product=Ziur al zaude produktu hau desinstalatu nahi duzula?
-could-not-connect-to-the-liferay-marketplace=Ezin izan da konektatu Liferay Marketplace-arekin.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fa.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fa.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fa.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fi.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fi.properties
deleted file mode 100644
index 04fd96a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fi.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Kaikki sovellukset
-app-manager=Sovellusten hallinta
-are-you-sure-you-want-to-uninstall-this=Oletko varma, että haluat poistaa tämän tuotteen asennuksen?
-are-you-sure-you-want-to-uninstall-this-product=Oletko varma, että haluat poistaa tämän tuotteen asennuksen?
-could-not-connect-to-the-liferay-marketplace=Liferayn markkinapaikkaan ei saada yhteyttä.
-file-upload-lpkg-or-war-file=Kopioi palvelimelle (LPKG tai WAR tiedosto)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Asennetut sovelluset ovat saatavilla kaikille portaalin ilmentymille. Jokaisessa portaali-ilmentymässä voit kytkeä sovelluksen päälle ja pois, menemällä Sovelluksien asetusnäytölle.
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Sovellusten hallinta
-reindex-search=Indeksoi uudellen.
-there-are-no-configurable-plugins-for-this-app=Tälle sovellukselle ei ole muokattavia laajennoksia.
-this-app-contains=Tämä sovellus sisältää:
-this-portlet-is-available-in-my-account=Tämä sovellus on käytettävissä omilla sivuilla.
-this-portlet-is-available-in-site-administration=Tämä sovellus on käytettävissä Sivuston Hallinnassa.
-this-portlet-is-available-in-the-control-panel=Tämä portlet on käytettävissä Hallintapaneelissa.
-unable-to-uninstall-app-or-plugin-because-it-is-required=En voi poistaa tätä sovellusta, koska sitä tarvitaan.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fr.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fr.properties
deleted file mode 100644
index 090102f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_fr.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Toutes les applications
-app-manager=Le gestionnaire d'applications
-are-you-sure-you-want-to-uninstall-this=Etes-vous de vouloir désinstaller cette application?
-are-you-sure-you-want-to-uninstall-this-product=Êtes-vous sûr de vouloir désinstaller ce produit?
-could-not-connect-to-the-liferay-marketplace=Impossible de se connecter au Market Place Liferay.
-file-upload-lpkg-or-war-file=Téléverser fichier (fichier LPKG ou WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Les applications installées sont disponible à toutes les instance de portail. Allez à configuration de plugin dans chaque instance de portail pour activer/désactier chaque application.
-javax.portlet.title.1_WAR_marketplaceportlet=Magasin (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Acheté (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Le gestionnaire d'applications
-reindex-search=Ré-indexer la recherche
-there-are-no-configurable-plugins-for-this-app=Il n'y a pas de plugins configurable for cette application.
-this-app-contains=Cette application contient:
-this-portlet-is-available-in-my-account=Cette portlet est disponible dans "Mon compte".
-this-portlet-is-available-in-site-administration=Cette portlet est disponible dans "l'Administration de site"
-this-portlet-is-available-in-the-control-panel=Cette portlet est disponible dans le panneau de contrôle.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Impossible de désinstaller l'application ou le plugin, car il est obligatoire.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_gl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_gl.properties
deleted file mode 100644
index 453a9b8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_gl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=¿Estás seguro de que queres desinstalar este producto?
-are-you-sure-you-want-to-uninstall-this-product=¿Estás seguro de que queres desinstalar este producto?
-could-not-connect-to-the-liferay-marketplace=Non se pode conectar a Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hi_IN.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hi_IN.properties
deleted file mode 100644
index a87c5bc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hi_IN.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=सभी क्षुधा (Automatic Translation)
-app-manager=अनुप्रयोग प्रबंधक (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=आप सुनिश्चित करें कि आप यह स्थापना रद्द करने के लिए चाहते हैं? (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=फ़ाइल अपलोड करें (LPKG या युद्ध फ़ाइल) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=स्थापित क्षुधा पोर्टल की सभी आवृत्तियों के लिए उपलब्ध हैं। Plugins विन्यास करने के लिए प्रत्येक पोर्टल उदाहरण के भीतर प्रत्येक अनुप्रयोग सक्षम करें/निष्क्रिय करने के लिए जाओ। (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=स्टोर (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=खरीदी (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=अनुप्रयोग प्रबंधक (Automatic Translation)
-reindex-search=खोज reindex (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=इस अनुप्रयोग के लिए कोई विन्यास plugins रहे हैं। (Automatic Translation)
-this-app-contains=इस app शामिल हैं: (Automatic Translation)
-this-portlet-is-available-in-my-account=इस portlet में मेरा खाता उपलब्ध है। (Automatic Translation)
-this-portlet-is-available-in-site-administration=इस portlet साइट व्यवस्थापन में उपलब्ध है। (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=इस portlet नियंत्रण पैनल में उपलब्ध है। (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=यह आवश्यक है क्योंकि अनुप्रयोग या प्लगइन की स्थापना रद्द करने में असमर्थ। (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hr.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hr.properties
deleted file mode 100644
index d07aacc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hr.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Da li ste sigurni da želite deinstalirati ovaj proizvod?
-are-you-sure-you-want-to-uninstall-this-product=Da li ste sigurni da želite deinstalirati ovaj proizvod?
-could-not-connect-to-the-liferay-marketplace=Nije moguće ostvariti vezu sa Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hu.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hu.properties
deleted file mode 100644
index 0aa3281..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_hu.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Minden alkalmazás
-app-manager=Alkalmazás menedzser
-are-you-sure-you-want-to-uninstall-this=Biztos, hogy törölni akarod ezt?
-are-you-sure-you-want-to-uninstall-this-product=Biztos, hogy törölni akarod ezt a terméket?
-could-not-connect-to-the-liferay-marketplace=Nem lehetséges a Liferay Marketplace-hez kapcsolódni.
-file-upload-lpkg-or-war-file=Fájl feltöltés (LPKG vagy WAR fájl)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=A telepített alkalmazások elérhetőek az összes portál példányban. Menj a Betelepülők Beállításába az egyes portál példányokban, hogy engedélyezhesd vagy letilthasd az egyes alkalmazásokat.
-javax.portlet.title.1_WAR_marketplaceportlet=Raktár
-javax.portlet.title.2_WAR_marketplaceportlet=Megvásárolva
-javax.portlet.title.3_WAR_marketplaceportlet=Alkalmazás menedzser
-reindex-search=Keresés újraindexelése
-there-are-no-configurable-plugins-for-this-app=Nincsenek konfigurálható bővítmények ehhez az alkalmazáshoz.
-this-app-contains=Ez az alkalmazás a következőket tartalmazza:
-this-portlet-is-available-in-my-account=A portlet elérhető a Saját fiókban.
-this-portlet-is-available-in-site-administration=A portlet elérhető a Webhely adminisztrációban.
-this-portlet-is-available-in-the-control-panel=Ez a portlet elérhető a Vezérlőközpontban.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Nem lehet eltávolítani az alkalmazást vagy beépülő modult, mert az kötelező.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_in.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_in.properties
deleted file mode 100644
index 67a0a2a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_in.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Apakah anda yakin ingin menghapus produk ini?
-are-you-sure-you-want-to-uninstall-this-product=Apakah anda yakin ingin menghapus produk ini?
-could-not-connect-to-the-liferay-marketplace=Tidak dapat terhubung ke Marketplace Liferay.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_it.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_it.properties
deleted file mode 100644
index af3c983..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_it.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Tutte le App
-app-manager=Gestore delle App
-are-you-sure-you-want-to-uninstall-this=Sicuro di volerlo disinstallare?
-are-you-sure-you-want-to-uninstall-this-product=Sicuro di voler disinstallare questo prodotto?
-could-not-connect-to-the-liferay-marketplace=Collegamento al Marketplace Liferay non riuscito.
-file-upload-lpkg-or-war-file=Caricamento File (LPKG o WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Le applicazioni installate sono accessibili a tutte le istanze di portale. Vai a Configurazione Plugins in ogni istanza di portale per abilitare/disabilitare ogni applicazione.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Acquistate
-javax.portlet.title.3_WAR_marketplaceportlet=Gestore delle App
-reindex-search=Reindicizza Ricerca
-there-are-no-configurable-plugins-for-this-app=Questa app non contiene plugin configurabili.
-this-app-contains=Questa app contiene:
-this-portlet-is-available-in-my-account=Questa portlet è disponibile nel Mio Account.
-this-portlet-is-available-in-site-administration=Questa portlet è disponibile in Amministrazione Sito.
-this-portlet-is-available-in-the-control-panel=Questa portlet è disponibile nel Pannello di Controllo.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Impossibile disinstallare questa app o plugin perché è obbligatorio.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_iw.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_iw.properties
deleted file mode 100644
index e9de929..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_iw.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=כל האפליקציות
-app-manager=אפליקצית ניהול
-are-you-sure-you-want-to-uninstall-this=?האם אתה בטוח שאתה מעונין להסיר את ההתקנה
-are-you-sure-you-want-to-uninstall-this-product=? האם אתה בטוח שאתה מעונין להסיר את המוצר
-could-not-connect-to-the-liferay-marketplace=Liferay לא מחובר לחנות
-file-upload-lpkg-or-war-file=(LPKG or WAR ) העלה מסמך חדש
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=אפליקציות שהותקנו טובות לכל מופעי הפורטל. לך לתצורת תוספים בכל מופע פורטל על מנת לאפשר/ לא לאפשר כל אפליקציה
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=אפליקצית ניהול
-reindex-search=לסדר מחדש חיפושים
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=האפליקציה הזו כוללת
-this-portlet-is-available-in-my-account=הפורטלט נמצאת בחשבון שלך
-this-portlet-is-available-in-site-administration=הפורטלט נמצאת בניהול האתר
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ja.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ja.properties
deleted file mode 100644
index dc53ccc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ja.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=全アプリ
-app-manager=アプリケーションマネージャ
-are-you-sure-you-want-to-uninstall-this=これをアンインストールしてもよいですか？
-are-you-sure-you-want-to-uninstall-this-product=このプロダクトをアンインストールしますか？
-could-not-connect-to-the-liferay-marketplace=ライフレイマーケットプレイスに接続できません。
-file-upload-lpkg-or-war-file=ファイルアップロード(LPKGかWARファイル)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=インストールされたアプリは全ポータルインスタンスで使用可能です。それぞれのポータルインスタンスのプラグイン設定に行き、アプリの有効/無効を設定してください
-javax.portlet.title.1_WAR_marketplaceportlet=マーケットプレイス
-javax.portlet.title.2_WAR_marketplaceportlet=購入済み
-javax.portlet.title.3_WAR_marketplaceportlet=アプリケーションマネージャ
-reindex-search=サーチの再インデックス
-there-are-no-configurable-plugins-for-this-app=このアプリケーション用の設定可能なプラグインがありません
-this-app-contains=このアプリケーションは以下を含みます :
-this-portlet-is-available-in-my-account=ポートレットは自アカウントで使用可能です
-this-portlet-is-available-in-site-administration=このポートレットはサイト管理者が使用可能です
-this-portlet-is-available-in-the-control-panel=このポートレットはコントロールパネルで表示されます
-unable-to-uninstall-app-or-plugin-because-it-is-required=使用中のため、プラグイン/アプリケーションをアンインストールできません。
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ko.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ko.properties
deleted file mode 100644
index 97e7a76..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ko.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=모든 애플 리 케이 션 (Automatic Translation)
-app-manager=응용 프로그램 관리자 (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=당신은 이것을 제거 하 시겠습니까? (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=당신은 확실한가 당신 이 제품을 설치를 해제하고 싶은가? (Automatic Translation)
-could-not-connect-to-the-liferay-marketplace=Liferay 시장에 연결할 수 없었다. (Automatic Translation)
-file-upload-lpkg-or-war-file=파일 업로드 (LPKG 또는 WAR 파일) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=설치 된 애플 리 케이 션 모든 포털 인스턴스에 사용할 수 있습니다. 각 포털 인스턴스를 활성화/비활성화 각 애플 리 케이 션 내에서 플러그인 구성으로 이동 합니다. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=저장소 (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=구입 (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=응용 프로그램 관리자 (Automatic Translation)
-reindex-search=다시 검색 (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=이 애플 리 케이이 션에 대 한 없는 구성 가능한 플러그인이 있습니다. (Automatic Translation)
-this-app-contains=이 응용 프로그램에 포함 되어 있습니다. (Automatic Translation)
-this-portlet-is-available-in-my-account=이 포틀릿 내 계정에서 이용하실 수 있습니다. (Automatic Translation)
-this-portlet-is-available-in-site-administration=이 포틀릿에 사이트 관리에 사용할 수 있는입니다. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=이 포틀릿에 컨트롤 패널에서 사용할 수 있는입니다. (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=필요 하기 때문에 응용 프로그램 또는 플러그인을 제거할 수 없습니다. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_lo.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_lo.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_lo.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_lt.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_lt.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_lt.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nb.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nb.properties
deleted file mode 100644
index 5e2b113..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nb.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle applikasjoner
-app-manager=Applikasjonsforvaltning
-are-you-sure-you-want-to-uninstall-this=Er du sikker på at du ønsker å avinstallere dette?
-are-you-sure-you-want-to-uninstall-this-product=Er du sikker på at du ønsker å avinstallere dette produktet?
-could-not-connect-to-the-liferay-marketplace=Kunne ikke koble til Liferay Markedsplass.
-file-upload-lpkg-or-war-file=Filopplasting (LPKG- eller WAR-fil)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installerte applikasjoner gjøres tilgjengelig for alle portalinstanser. Gå til plugin-konfigurasjon i hver enkelt portalinstans for å aktivere/deaktivere hver enkelt applikasjon.
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Applikasjonsforvaltning
-reindex-search=Reindekser søk
-there-are-no-configurable-plugins-for-this-app=Det finnes ingen konfigurerbare plugins for denne applikasjonen.
-this-app-contains=Denne applikasjonen inneholder:
-this-portlet-is-available-in-my-account=Denne portleten er tilgjengelig under min konto.
-this-portlet-is-available-in-site-administration=Denne portleten er tilgjengelig under nettstedsadministrasjon.
-this-portlet-is-available-in-the-control-panel=Denne portleten er tilgjengelig i kontrollpanelet.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Applikasjonen eller plugin kan ikke avinstalleres fordi den er påkrevd.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nl.properties
deleted file mode 100644
index 7463506..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle apps
-app-manager=App manager
-are-you-sure-you-want-to-uninstall-this=Weet u zeker dat u dit wilt deïnstalleren?
-are-you-sure-you-want-to-uninstall-this-product=Weet u zeker dat u dit product wilt deïnstalleren?
-could-not-connect-to-the-liferay-marketplace=Er kon geen verbinding worden gemaakt met Liferay Marketplace.
-file-upload-lpkg-or-war-file=Bestand uploaden (LPKG- of WAR-bestand)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Geïnstalleerde apps zijn beschikbaar voor alle portalinstanties. Ga naar 'Toepassingen configureren' om deze per portalinstantie uit te schakelen.
-javax.portlet.title.1_WAR_marketplaceportlet=Winkel (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Gekocht (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=App manager
-reindex-search=Zoeken herindexeren
-there-are-no-configurable-plugins-for-this-app=Er zijn geen configureerbare plug-ins voor deze app.
-this-app-contains=Deze app bevat:
-this-portlet-is-available-in-my-account=Deze portlet is beschikbaar in Mijn account.
-this-portlet-is-available-in-site-administration=Deze portlet is beschikbaar in Sitebeheer.
-this-portlet-is-available-in-the-control-panel=Deze portlet is beschikbaar in het Controlepaneel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=De app of plug-in kan niet worden gedeïnstalleerd omdat deze plug-in benodigd is.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nl_BE.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nl_BE.properties
deleted file mode 100644
index 9e94a22..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_nl_BE.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle Apps (Automatic Translation)
-app-manager=App Manager (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=Weet u zeker dat u wilt verwijderen van dit? (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=Zeker bent u u wilt desinstallatie dit product? (Automatic Translation)
-could-not-connect-to-the-liferay-marketplace=Kon niet met de Markt verbinden Liferay. (Automatic Translation)
-file-upload-lpkg-or-war-file=Bestand uploaden (LPKG of WAR-bestand) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Geïnstalleerde apps zijn beschikbaar voor alle portal exemplaren. Ga naar Plugins configuratie binnen elk portaal exemplaar te activeren/deactiveren elke app. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=Winkel (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Gekocht (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Translation)
-reindex-search=Zoek opnieuw indexeren (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=Er zijn geen configureerbare plugins voor dit app. (Automatic Translation)
-this-app-contains=Dit app bevat: (Automatic Translation)
-this-portlet-is-available-in-my-account=Dit portlet is beschikbaar in MijnAccount. (Automatic Translation)
-this-portlet-is-available-in-site-administration=Dit portlet is beschikbaar in Sitebeheer. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Onvermogend voor uninstall app of plugin, omdat het vereist is. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pl.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pt_BR.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pt_BR.properties
deleted file mode 100644
index 8b6cb69..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pt_BR.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Todos os aplicativos
-app-manager=Gerenciador de aplicativos
-are-you-sure-you-want-to-uninstall-this=Tem certeza de que deseja desinstalar este produto?
-are-you-sure-you-want-to-uninstall-this-product=Tem certeza de que deseja desinstalar este produto?
-could-not-connect-to-the-liferay-marketplace=Não foi possível conectar ao Liferay Marketplace.
-file-upload-lpkg-or-war-file=Upload de arquivo (LPKG ou WAR File)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Aplicativos instalados estão disponíveis para todas as instâncias do portal. Vá nas Configurações dos Plugins dentro de cada instância portal para ativar/desativar cada aplicativo.
-javax.portlet.title.1_WAR_marketplaceportlet=Loja (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Comprado (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Gerenciador de aplicativos
-reindex-search=Reindexar busca
-there-are-no-configurable-plugins-for-this-app=Não há plugins configuráveis para este App.
-this-app-contains=Este App contém:
-this-portlet-is-available-in-my-account=Este portlet esta disponível em Minha Conta.
-this-portlet-is-available-in-site-administration=Este portlet esta disponível em Administração do Site.
-this-portlet-is-available-in-the-control-panel=Este portlet esta disponível no Painel de Controle.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Não foi possível desinstalar o app ou plugin pois ele é requerido.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pt_PT.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pt_PT.properties
deleted file mode 100644
index 1f2d5eb..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_pt_PT.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Todos os Apps (Automatic Translation)
-app-manager=App Manager (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=Confirma que deseja desinstalar este produto?
-are-you-sure-you-want-to-uninstall-this-product=Confirma que deseja desinstalar este produto?
-could-not-connect-to-the-liferay-marketplace=Não foi possível estabelecer conexão com o Marketplace da Liferay.
-file-upload-lpkg-or-war-file=Upload de arquivo (LPKG ou arquivo WAR) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Apps instalados estão disponíveis para todas as instâncias de portal. Vá para configuração de Plugins dentro de cada instância portal para ativar/desativar cada app. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=Loja (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Comprado (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Translation)
-reindex-search=Reindexar pesquisa (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=Existem plugins configurável para este app. (Automatic Translation)
-this-app-contains=Este aplicativo contém: (Automatic Translation)
-this-portlet-is-available-in-my-account=Este portlet está disponível em minha conta. (Automatic Translation)
-this-portlet-is-available-in-site-administration=Este portlet está disponível no Site de administração. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=Este portlet está disponível no painel de controle. (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Não é possível desinstalar o app ou plugin porque é necessário. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ro.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ro.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ro.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ru.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ru.properties
deleted file mode 100644
index c711953..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_ru.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Все приложения
-app-manager=Менеджер Приложений
-are-you-sure-you-want-to-uninstall-this=Вы действительно хотите удалить это?
-are-you-sure-you-want-to-uninstall-this-product=Вы действительно хотите удалить это приложение?
-could-not-connect-to-the-liferay-marketplace=Невозможно подключиться к Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Менеджер Приложений
-reindex-search=Переиндексировать поиск
-there-are-no-configurable-plugins-for-this-app=Для этого приложения нет настраиваемых плагинов.
-this-app-contains=Это приложение содержит:
-this-portlet-is-available-in-my-account=Этот портлет доступен в Моем Профиле.
-this-portlet-is-available-in-site-administration=Этот портлет доступен в Администрировании сайтом.
-this-portlet-is-available-in-the-control-panel=Этот портлет доступен в Панели Управления.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sk.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sk.properties
deleted file mode 100644
index 0734215..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sk.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Všetky aplikácie
-app-manager=Správca aplikácii
-are-you-sure-you-want-to-uninstall-this=Ste si istý, že chcete toto odinštalovať?
-are-you-sure-you-want-to-uninstall-this-product=Ste si istý, že chcete odinštalovať tento produkt?
-could-not-connect-to-the-liferay-marketplace=Nepodarilo sa pripojiť do Liferay Marketplace.
-file-upload-lpkg-or-war-file=Nahranie súboru (súbor typu LPKG alebo WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Nainštalované aplikácie sú dostupné pre všetky inštancie portálu. Choďte do Konfigurácie zásuvných modulov v každej inštancii portálu aby ste ich povolili alebo zakázali.
-javax.portlet.title.1_WAR_marketplaceportlet=Skladisko
-javax.portlet.title.2_WAR_marketplaceportlet=Objednané
-javax.portlet.title.3_WAR_marketplaceportlet=Správca aplikácii
-reindex-search=Preindexovať vyhľadávanie
-there-are-no-configurable-plugins-for-this-app=Pre túto aplikáciu nie sú žiadne konfigurovateľné zásuvné moduly.
-this-app-contains=Táto aplikácia obsahuje:
-this-portlet-is-available-in-my-account=Tento portlet je dostupný v Mojom účte.
-this-portlet-is-available-in-site-administration=Tento portlet dostupný v Správe sídla.
-this-portlet-is-available-in-the-control-panel=Tento portlet je dostupný cez ovládací panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Nemôžem odinštalovať aplikáciu alebo zásuvný modul, lebo je požadovaný.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sl.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sr_RS.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sr_RS.properties
deleted file mode 100644
index ce498ed..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sr_RS.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Све апликације
-app-manager=Управљање апликацијама
-are-you-sure-you-want-to-uninstall-this=Да ли сте сигурни да желите да деинсталирате ово?
-are-you-sure-you-want-to-uninstall-this-product=Да ли сте сигурни да желите да деинсталирате ова производ?
-could-not-connect-to-the-liferay-marketplace=Не могу се конектовати на Liferay Marketplace?
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Управљање апликацијама
-reindex-search=Реиндекс Претрага
-there-are-no-configurable-plugins-for-this-app=Нема конфигурабилних додатака за ову апликацију.
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sr_RS_latin.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sr_RS_latin.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sr_RS_latin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sv.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sv.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_sv.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_tr.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_tr.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_tr.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_uk.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_uk.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_uk.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_vi.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_vi.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_vi.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_zh_CN.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_zh_CN.properties
deleted file mode 100644
index c783e81..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_zh_CN.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=所有应用
-app-manager=应用程序管理器
-are-you-sure-you-want-to-uninstall-this=您确定要卸载这一产品吗？
-are-you-sure-you-want-to-uninstall-this-product=您确定要卸载这一产品吗？
-could-not-connect-to-the-liferay-marketplace=不能连接至Liferay Marketplace。
-file-upload-lpkg-or-war-file=文件上传（LPKG或WAR文件）
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=已安装的应用程序可供所有portal实例使用。可以在每个portal实例的Plugin设置里使用/停用应用程序。
-javax.portlet.title.1_WAR_marketplaceportlet=商店
-javax.portlet.title.2_WAR_marketplaceportlet=已购买
-javax.portlet.title.3_WAR_marketplaceportlet=应用程序管理器
-reindex-search=重建索引搜索
-there-are-no-configurable-plugins-for-this-app=这一应用没有可配置的plugin。
-this-app-contains=这一应用包含：
-this-portlet-is-available-in-my-account=这一portlet在我的账户中可用。
-this-portlet-is-available-in-site-administration=这一portlet在站点管理中可用。
-this-portlet-is-available-in-the-control-panel=这一portlet在控制面板中可用。
-unable-to-uninstall-app-or-plugin-because-it-is-required=无法卸载软件或plugin，因为它是必需的。
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_zh_TW.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_zh_TW.properties
deleted file mode 100644
index 65e4ece..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/content/Language_zh_TW.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=所有應用程式
-app-manager=應用程式管理員
-are-you-sure-you-want-to-uninstall-this=您確定想要移除這個？
-are-you-sure-you-want-to-uninstall-this-product=您確定想要移除這產品？
-could-not-connect-to-the-liferay-marketplace=連結不到Liferay市集。
-file-upload-lpkg-or-war-file=檔案上傳(LPKG 或 WAR 檔)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=安裝的應用程式可提供給所有入口網實體。到每個入口網實體的插件設定以啟用/停用每個應用程式。
-javax.portlet.title.1_WAR_marketplaceportlet=存儲區 (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=購買 (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=應用程式管理員
-reindex-search=重新索引搜尋
-there-are-no-configurable-plugins-for-this-app=沒有為這應用程式設定插件。
-this-app-contains=這應用程式包含：
-this-portlet-is-available-in-my-account=這Portlet在您帳戶是可用的。
-this-portlet-is-available-in-site-administration=這Portlet在站台系統管理員是可用的。
-this-portlet-is-available-in-the-control-panel=這Portlet在控制面板是可用的。
-unable-to-uninstall-app-or-plugin-because-it-is-required=無法移除應用程式或插件因為它是必需的。
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/log4j.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/log4j.properties
deleted file mode 100644
index f55ce5c..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/log4j.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-log4j.rootLogger=INFO, CONSOLE
-
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.layout=org.apache.log4j.EnhancedPatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/logging.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/logging.properties
deleted file mode 100644
index 4d09299..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/logging.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-debug.com.sun.portal.level=WARNING
-
-org.apache.catalina.core.ContainerBase.[Catalina].handlers=java.util.logging.ConsoleHandler
-org.apache.catalina.core.ContainerBase.[Catalina].level=INFO
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/portal.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/portal.properties
deleted file mode 100644
index 1c82001..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/portal.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-release.info.build.number=100
-release.info.previous.build.number=0
-
-upgrade.processes=\
-    com.liferay.marketplace.hook.upgrade.UpgradeProcess_1_0_0
-
-application.startup.events=com.liferay.marketplace.hook.events.StartupAction
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/portlet.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/portlet.properties
deleted file mode 100644
index a975b57..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/portlet.properties
+++ /dev/null
@@ -1 +0,0 @@
-plugin.package.name=Marketplace
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/service.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/service.properties
deleted file mode 100644
index 909dd5b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/classes/service.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-##
-## Properties Override
-##
-
-    #
-    # Specify where to get the overridden properties. Updates should not be made
-    # on this file but on the overridden version of this file.
-    #
-    include-and-override=${base.path}/service-ext.properties
-
-##
-## Build
-##
-
-    build.namespace=Marketplace
-    build.number=3
-    build.date=1371580382539
-    build.auto.upgrade=true
-
-##
-## Spring
-##
-
-    #
-    # Input a list of comma delimited Spring configurations. These will be
-    # loaded after the bean definitions specified in the
-    # portalContextConfigLocation parameter in web.xml.
-    #
-    spring.configs=\
-        WEB-INF/classes/META-INF/base-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/hibernate-spring.xml,\
-        WEB-INF/classes/META-INF/infrastructure-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/cluster-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/portlet-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/shard-data-source-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/ext-spring.xml
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/jsp/_servlet_context_include.jsp b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/jsp/_servlet_context_include.jsp
deleted file mode 100644
index 2dc2f79..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/jsp/_servlet_context_include.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<%@ taglib uri="http://liferay.com/tld/util" prefix="liferay-util" %>
-
-<%@ page contentType="text/html; charset=UTF-8" %>
-
-<%@ page import="com.liferay.portal.kernel.util.WebKeys" %>
-
-<%
-String path = (String)request.getAttribute(WebKeys.SERVLET_CONTEXT_INCLUDE_FILTER_PATH);
-String portletId = (String)request.getAttribute(WebKeys.PORTLET_ID);
-%>
-
-<liferay-util:include page="<%= path %>" portletId="<%= portletId %>" />
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/commons-logging.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/commons-logging.jar
deleted file mode 100644
index 8758a96..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/commons-logging.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/jstl-api.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/jstl-api.jar
deleted file mode 100644
index 80a5737..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/jstl-api.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/jstl-impl.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/jstl-impl.jar
deleted file mode 100644
index e5a9342..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/jstl-impl.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/log4j-extras.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/log4j-extras.jar
deleted file mode 100644
index 61ab1c9..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/log4j-extras.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/log4j.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/log4j.jar
deleted file mode 100644
index 068867e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/log4j.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/marketplace-portlet-service.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/marketplace-portlet-service.jar
deleted file mode 100644
index 8ac503d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/marketplace-portlet-service.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/portal-compat-shared.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/portal-compat-shared.jar
deleted file mode 100644
index 070c613..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/portal-compat-shared.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-bridges.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-bridges.jar
deleted file mode 100644
index cd380ca..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-bridges.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-java.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-java.jar
deleted file mode 100644
index 9c76d84..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-java.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-taglib.jar b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-taglib.jar
deleted file mode 100644
index 7fbd300..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/lib/util-taglib.jar
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-hook.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-hook.xml
deleted file mode 100644
index 944195a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-hook.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
-
-<hook>
-	<portal-properties>portal.properties</portal-properties>
-</hook>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-plugin-package.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-plugin-package.properties
deleted file mode 100644
index 0ec1ded..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-plugin-package.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-name=Marketplace
-module-group-id=liferay
-module-incremental-version=1
-tags=
-short-description=
-long-description=
-change-log=
-page-url=http://www.liferay.com
-author=Liferay, Inc.
-licenses=LGPL
-liferay-versions=6.2.0+
-
-portal-dependency-jars=\
-    jstl-api.jar,\
-    jstl-impl.jar
-
-portal-dependency-tlds=\
-    c.tld
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-plugin-package.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-plugin-package.xml
deleted file mode 100644
index d90d3e8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-plugin-package.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE plugin-package PUBLIC "-//Liferay//DTD Plugin Package 6.1.0//EN" "http://www.liferay.com/dtd/liferay-plugin-package_6_1_0.dtd">
-
-<plugin-package>
-	<name>Marketplace Portlet</name>
-	<module-id>liferay/marketplace-portlet/6.2.0.1/war</module-id>
-	<recommended-deployment-context>marketplace-portlet</recommended-deployment-context>
-	<required-deployment-contexts></required-deployment-contexts>
-	<types>
-		<type>portlet</type>
-	</types>
-	<tags></tags>
-	<short-description></short-description>
-	<long-description></long-description>
-	<change-log></change-log>
-	<page-url>http://www.liferay.com</page-url>
-	<author>Liferay, Inc.</author>
-	<licenses>
-		<license osi-approved="true">LGPL</license>
-	</licenses>
-	<liferay-versions>
-		<liferay-version>6.2.0+</liferay-version>
-	</liferay-versions>
-</plugin-package>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-portlet.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-portlet.xml
deleted file mode 100644
index dce0777..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-portlet.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.0.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_0_0.dtd">
-
-<liferay-portlet-app>
-	<portlet>
-		<portlet-name>1</portlet-name>
-		<icon>/store/icon.png</icon>
-		<control-panel-entry-category>marketplace</control-panel-entry-category>
-		<control-panel-entry-weight>2.0</control-panel-entry-weight>
-		<control-panel-entry-class>com.liferay.marketplace.store.portlet.StoreControlPanelEntry</control-panel-entry-class>
-		<use-default-template>false</use-default-template>
-		<private-request-attributes>false</private-request-attributes>
-		<private-session-attributes>false</private-session-attributes>
-		<render-weight>50</render-weight>
-		<header-portlet-css>/store/css/main.css</header-portlet-css>
-		<header-portlet-javascript>/store/js/main.js</header-portlet-javascript>
-		<css-class-wrapper>marketplace-portlet</css-class-wrapper>
-		<add-default-resource>true</add-default-resource>
-		<system>true</system>
-	</portlet>
-	<portlet>
-		<portlet-name>2</portlet-name>
-		<icon>/my_marketplace/icon.png</icon>
-		<control-panel-entry-category>marketplace</control-panel-entry-category>
-		<control-panel-entry-weight>3.0</control-panel-entry-weight>
-		<control-panel-entry-class>com.liferay.marketplace.store.portlet.StoreControlPanelEntry</control-panel-entry-class>
-		<preferences-owned-by-group>false</preferences-owned-by-group>
-		<use-default-template>false</use-default-template>
-		<private-request-attributes>false</private-request-attributes>
-		<private-session-attributes>false</private-session-attributes>
-		<render-weight>50</render-weight>
-		<header-portlet-css>/store/css/main.css</header-portlet-css>
-		<header-portlet-javascript>/store/js/main.js</header-portlet-javascript>
-		<css-class-wrapper>marketplace-portlet</css-class-wrapper>
-		<add-default-resource>true</add-default-resource>
-		<system>true</system>
-	</portlet>
-	<portlet>
-		<portlet-name>3</portlet-name>
-		<icon>/app_manager/icon.png</icon>
-		<control-panel-entry-category>marketplace</control-panel-entry-category>
-		<control-panel-entry-weight>1.0</control-panel-entry-weight>
-		<control-panel-entry-class>com.liferay.marketplace.appmanager.portlet.AppManagerControlPanelEntry</control-panel-entry-class>
-		<preferences-owned-by-group>false</preferences-owned-by-group>
-		<use-default-template>false</use-default-template>
-		<private-request-attributes>false</private-request-attributes>
-		<private-session-attributes>false</private-session-attributes>
-		<render-weight>50</render-weight>
-		<header-portlet-css>/app_manager/css/main.css</header-portlet-css>
-		<css-class-wrapper>marketplace-portlet</css-class-wrapper>
-		<add-default-resource>true</add-default-resource>
-		<system>true</system>
-	</portlet>
-	<role-mapper>
-		<role-name>administrator</role-name>
-		<role-link>Administrator</role-link>
-	</role-mapper>
-	<role-mapper>
-		<role-name>guest</role-name>
-		<role-link>Guest</role-link>
-	</role-mapper>
-	<role-mapper>
-		<role-name>power-user</role-name>
-		<role-link>Power User</role-link>
-	</role-mapper>
-	<role-mapper>
-		<role-name>user</role-name>
-		<role-link>User</role-link>
-	</role-mapper>
-</liferay-portlet-app>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.changelog b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.changelog
deleted file mode 100644
index 2c7b366..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.changelog
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# Module Incremental Version 1
-#
-TEMP=
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.changelog.md5 b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.changelog.md5
deleted file mode 100644
index e66dae1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.changelog.md5
+++ /dev/null
@@ -1 +0,0 @@
-ab2c86ac0d591a27348b1f752295fc72
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.properties
deleted file mode 100644
index b65edaa..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-releng.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-bundle=true
-category=
-demo-url=
-dependent-apps=
-labs=false
-marketplace=true
-public=true
-support-url=
-supported=false
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-web.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-web.xml
deleted file mode 100644
index 7973558..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/liferay-web.xml
+++ /dev/null
@@ -1,383 +0,0 @@
-<?xml version="1.0"?>
-
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-	<filter>
-		<filter-name>Compound Session Id Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.compoundsessionid.CompoundSessionIdFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Thread Local Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.threadlocal.ThreadLocalFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Ignore Filter - FTL</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.ignore.IgnoreFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Ignore Filter - JSPF</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.ignore.IgnoreFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Ignore Filter - VM</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.ignore.IgnoreFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Aggregate Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.aggregate.AggregateFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Aggregate Filter - JSP</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.aggregate.AggregateFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-pattern</param-name>
-			<param-value>.+/(css|main)\.jsp</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Cache Filter - Resource</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.cache.CacheFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-ignore-pattern</param-name>
-			<param-value>.+/-/.+</param-value>
-		</init-param>
-		<init-param>
-			<param-name>pattern</param-name>
-			<param-value>2</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Cache Filter - Resource JSP</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.cache.CacheFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-pattern</param-name>
-			<param-value>.+/(css|main)\.jsp</param-value>
-		</init-param>
-		<init-param>
-			<param-name>pattern</param-name>
-			<param-value>2</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Dynamic CSS Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.dynamiccss.DynamicCSSFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Dynamic CSS Filter - JSP</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.dynamiccss.DynamicCSSFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-pattern</param-name>
-			<param-value>.+/(css|main)\.jsp</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>ETag Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.etag.ETagFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-ignore-pattern</param-name>
-			<param-value>.+/-/.+</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>ETag Filter - JSP</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.etag.ETagFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-pattern</param-name>
-			<param-value>.+/(css|main)\.jsp</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>GZip Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.gzip.GZipFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>GZip Filter - Theme PNG</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.gzip.GZipFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-pattern</param-name>
-			<param-value>.+/themes/.*/images/.*\.png</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Header Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.header.HeaderFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-ignore-pattern</param-name>
-			<param-value>.+/-/.+</param-value>
-		</init-param>
-		<init-param>
-			<param-name>Cache-Control</param-name>
-			<param-value>max-age=315360000, public</param-value>
-		</init-param>
-		<init-param>
-			<param-name>Expires</param-name>
-			<param-value>315360000</param-value>
-		</init-param>
-		<init-param>
-			<param-name>Vary</param-name>
-			<param-value>Accept-Encoding</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Header Filter - JSP</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.header.HeaderFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-pattern</param-name>
-			<param-value>.+/(css|main)\.jsp</param-value>
-		</init-param>
-		<init-param>
-			<param-name>Cache-Control</param-name>
-			<param-value>max-age=315360000, public</param-value>
-		</init-param>
-		<init-param>
-			<param-name>Expires</param-name>
-			<param-value>315360000</param-value>
-		</init-param>
-		<init-param>
-			<param-name>Vary</param-name>
-			<param-value>Accept-Encoding</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Language Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.language.LanguageFilter</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Servlet Context Include Filter</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.PortalClassLoaderFilter</filter-class>
-		<init-param>
-			<param-name>filter-class</param-name>
-			<param-value>com.liferay.portal.servlet.filters.servletcontextinclude.ServletContextIncludeFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>url-regex-ignore-pattern</param-name>
-			<param-value>.*/WEB-INF/jsp/_servlet_context_include.jsp</param-value>
-		</init-param>
-	</filter>
-	<filter-mapping>
-		<filter-name>Thread Local Filter</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Compound Session Id Filter</filter-name>
-		<url-pattern>/*</url-pattern>
-		<dispatcher>ERROR</dispatcher>
-		<dispatcher>FORWARD</dispatcher>
-		<dispatcher>INCLUDE</dispatcher>
-		<dispatcher>REQUEST</dispatcher>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Ignore Filter - FTL</filter-name>
-		<url-pattern>*.ftl</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Ignore Filter - JSPF</filter-name>
-		<url-pattern>*.jspf</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Ignore Filter - VM</filter-name>
-		<url-pattern>*.vm</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.css</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.gif</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.html</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.ico</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.jpg</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.js</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter</filter-name>
-		<url-pattern>*.png</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Header Filter - JSP</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.css</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.gif</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.html</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.ico</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.jpg</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.js</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter</filter-name>
-		<url-pattern>*.png</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>ETag Filter - JSP</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Cache Filter - Resource</filter-name>
-		<url-pattern>*.css</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Cache Filter - Resource</filter-name>
-		<url-pattern>*.html</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Cache Filter - Resource</filter-name>
-		<url-pattern>*.js</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Cache Filter - Resource JSP</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>GZip Filter</filter-name>
-		<url-pattern>*.css</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>GZip Filter</filter-name>
-		<url-pattern>*.html</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>GZip Filter</filter-name>
-		<url-pattern>*.js</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>GZip Filter</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>GZip Filter - Theme PNG</filter-name>
-		<url-pattern>*.png</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Language Filter</filter-name>
-		<url-pattern>*.js</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Aggregate Filter</filter-name>
-		<url-pattern>*.css</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Aggregate Filter</filter-name>
-		<url-pattern>*.js</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Aggregate Filter - JSP</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Dynamic CSS Filter</filter-name>
-		<url-pattern>*.css</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Dynamic CSS Filter - JSP</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Servlet Context Include Filter</filter-name>
-		<url-pattern>*.jsp</url-pattern>
-		<dispatcher>FORWARD</dispatcher>
-		<dispatcher>INCLUDE</dispatcher>
-		<dispatcher>REQUEST</dispatcher>
-	</filter-mapping>
-</web-app>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/portlet.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/portlet.xml
deleted file mode 100644
index 7255cc4..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/portlet.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0"?>
-
-<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0">
-	<portlet>
-		<portlet-name>1</portlet-name>
-		<display-name>Store</display-name>
-		<portlet-class>com.liferay.marketplace.store.portlet.StorePortlet</portlet-class>
-		<init-param>
-			<name>view-template</name>
-			<value>/store/view.jsp</value>
-		</init-param>
-		<expiration-cache>0</expiration-cache>
-		<supports>
-			<mime-type>text/html</mime-type>
-		</supports>
-		<resource-bundle>content.Language</resource-bundle>
-		<portlet-info>
-			<title>Store</title>
-			<short-title>Store</short-title>
-			<keywords>Store</keywords>
-		</portlet-info>
-		<security-role-ref>
-			<role-name>administrator</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>guest</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>power-user</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>user</role-name>
-		</security-role-ref>
-	</portlet>
-	<portlet>
-		<portlet-name>2</portlet-name>
-		<display-name>Purchased</display-name>
-		<portlet-class>com.liferay.marketplace.store.portlet.StorePortlet</portlet-class>
-		<init-param>
-			<name>view-template</name>
-			<value>/store/view.jsp</value>
-		</init-param>
-		<expiration-cache>0</expiration-cache>
-		<supports>
-			<mime-type>text/html</mime-type>
-		</supports>
-		<resource-bundle>content.Language</resource-bundle>
-		<portlet-info>
-			<title>Purchased</title>
-			<short-title>Purchased</short-title>
-			<keywords>Purchased</keywords>
-		</portlet-info>
-		<security-role-ref>
-			<role-name>administrator</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>guest</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>power-user</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>user</role-name>
-		</security-role-ref>
-	</portlet>
-	<portlet>
-		<portlet-name>3</portlet-name>
-		<display-name>App Manager</display-name>
-		<portlet-class>com.liferay.marketplace.appmanager.portlet.AppManagerPortlet</portlet-class>
-		<init-param>
-			<name>view-template</name>
-			<value>/app_manager/view.jsp</value>
-		</init-param>
-		<expiration-cache>0</expiration-cache>
-		<supports>
-			<mime-type>text/html</mime-type>
-		</supports>
-		<resource-bundle>content.Language</resource-bundle>
-		<portlet-info>
-			<title>App Manager</title>
-			<short-title>App Manager</short-title>
-			<keywords>App Manager</keywords>
-		</portlet-info>
-		<security-role-ref>
-			<role-name>administrator</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>guest</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>power-user</role-name>
-		</security-role-ref>
-		<security-role-ref>
-			<role-name>user</role-name>
-		</security-role-ref>
-	</portlet>
-</portlet-app>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service.xml
deleted file mode 100644
index 0a4f176..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.2.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_2_0.dtd">
-
-<service-builder package-path="com.liferay.marketplace">
-	<author>Ryan Park</author>
-	<namespace>Marketplace</namespace>
-	<entity name="App" uuid="true" local-service="true" remote-service="true">
-		<!-- PK fields -->
-		<column name="appId" type="long" primary="true"></column>
-		<!-- Audit fields -->
-		<column name="companyId" type="long"></column>
-		<column name="userId" type="long"></column>
-		<column name="userName" type="String"></column>
-		<column name="createDate" type="Date"></column>
-		<column name="modifiedDate" type="Date"></column>
-		<!-- Other fields -->
-		<column name="remoteAppId" type="long"></column>
-		<column name="title" type="String"></column>
-		<column name="description" type="String"></column>
-		<column name="category" type="String"></column>
-		<column name="iconURL" type="String"></column>
-		<column name="version" type="String"></column>
-		<!-- Finder methods -->
-		<finder name="CompanyId" return-type="Collection">
-			<finder-column name="companyId"></finder-column>
-		</finder>
-		<finder name="RemoteAppId" return-type="App">
-			<finder-column name="remoteAppId"></finder-column>
-		</finder>
-		<finder name="Category" return-type="Collection">
-			<finder-column name="category"></finder-column>
-		</finder>
-	</entity>
-	<entity name="Module" uuid="true" local-service="true" remote-service="false">
-		<!-- PK fields -->
-		<column name="moduleId" type="long" primary="true"></column>
-		<!-- Other fields -->
-		<column name="appId" type="long"></column>
-		<column name="contextName" type="String"></column>
-		<!-- Finder methods -->
-		<finder name="AppId" return-type="Collection">
-			<finder-column name="appId"></finder-column>
-		</finder>
-		<finder name="ContextName" return-type="Collection">
-			<finder-column name="contextName"></finder-column>
-		</finder>
-		<finder name="A_C" return-type="Module">
-			<finder-column name="appId"></finder-column>
-			<finder-column name="contextName"></finder-column>
-		</finder>
-	</entity>
-	<exceptions>
-		<exception>AppProperties</exception>
-		<exception>AppTitle</exception>
-		<exception>AppVersion</exception>
-		<exception>DuplicateApp</exception>
-	</exceptions>
-</service-builder>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppPropertiesException.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppPropertiesException.java
deleted file mode 100644
index 850b632..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppPropertiesException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace;
-
-import com.liferay.portal.kernel.exception.PortalException;
-
-/**
- * @author Ryan Park
- */
-public class AppPropertiesException extends PortalException {
-
-	public AppPropertiesException() {
-		super();
-	}
-
-	public AppPropertiesException(String msg) {
-		super(msg);
-	}
-
-	public AppPropertiesException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-	public AppPropertiesException(Throwable cause) {
-		super(cause);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppTitleException.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppTitleException.java
deleted file mode 100644
index 0a66604..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppTitleException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace;
-
-import com.liferay.portal.kernel.exception.PortalException;
-
-/**
- * @author Ryan Park
- */
-public class AppTitleException extends PortalException {
-
-	public AppTitleException() {
-		super();
-	}
-
-	public AppTitleException(String msg) {
-		super(msg);
-	}
-
-	public AppTitleException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-	public AppTitleException(Throwable cause) {
-		super(cause);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppVersionException.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppVersionException.java
deleted file mode 100644
index 2649174..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/AppVersionException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace;
-
-import com.liferay.portal.kernel.exception.PortalException;
-
-/**
- * @author Ryan Park
- */
-public class AppVersionException extends PortalException {
-
-	public AppVersionException() {
-		super();
-	}
-
-	public AppVersionException(String msg) {
-		super(msg);
-	}
-
-	public AppVersionException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-	public AppVersionException(Throwable cause) {
-		super(cause);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/DuplicateAppException.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/DuplicateAppException.java
deleted file mode 100644
index 7b8d204..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/DuplicateAppException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace;
-
-import com.liferay.portal.kernel.exception.PortalException;
-
-/**
- * @author Ryan Park
- */
-public class DuplicateAppException extends PortalException {
-
-	public DuplicateAppException() {
-		super();
-	}
-
-	public DuplicateAppException(String msg) {
-		super(msg);
-	}
-
-	public DuplicateAppException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-	public DuplicateAppException(Throwable cause) {
-		super(cause);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/NoSuchAppException.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/NoSuchAppException.java
deleted file mode 100644
index 22c1127..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/NoSuchAppException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace;
-
-import com.liferay.portal.NoSuchModelException;
-
-/**
- * @author Ryan Park
- */
-public class NoSuchAppException extends NoSuchModelException {
-
-	public NoSuchAppException() {
-		super();
-	}
-
-	public NoSuchAppException(String msg) {
-		super(msg);
-	}
-
-	public NoSuchAppException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-	public NoSuchAppException(Throwable cause) {
-		super(cause);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/NoSuchModuleException.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/NoSuchModuleException.java
deleted file mode 100644
index d2d1418..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/NoSuchModuleException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace;
-
-import com.liferay.portal.NoSuchModelException;
-
-/**
- * @author Ryan Park
- */
-public class NoSuchModuleException extends NoSuchModelException {
-
-	public NoSuchModuleException() {
-		super();
-	}
-
-	public NoSuchModuleException(String msg) {
-		super(msg);
-	}
-
-	public NoSuchModuleException(String msg, Throwable cause) {
-		super(msg, cause);
-	}
-
-	public NoSuchModuleException(Throwable cause) {
-		super(cause);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/App.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/App.java
deleted file mode 100644
index 4f045d2..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/App.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.portal.model.PersistedModel;
-
-/**
- * The extended model interface for the App service. Represents a row in the &quot;Marketplace_App&quot; database table, with each column mapped to a property of this class.
- *
- * @author Ryan Park
- * @see AppModel
- * @see com.liferay.marketplace.model.impl.AppImpl
- * @see com.liferay.marketplace.model.impl.AppModelImpl
- * @generated
- */
-public interface App extends AppModel, PersistedModel {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this interface directly. Add methods to {@link com.liferay.marketplace.model.impl.AppImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
-	 */
-	public java.lang.String[] addContextName(java.lang.String contextName);
-
-	public java.lang.String[] getContextNames()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	public java.lang.String getFileDir();
-
-	public java.lang.String getFileName();
-
-	public java.lang.String getFilePath();
-
-	public boolean isDownloaded()
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public boolean isInstalled()
-		throws com.liferay.portal.kernel.exception.SystemException;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppClp.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppClp.java
deleted file mode 100644
index 979801d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppClp.java
+++ /dev/null
@@ -1,868 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-import com.liferay.marketplace.service.ClpSerializer;
-
-import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.lar.StagedModelType;
-import com.liferay.portal.kernel.util.ProxyUtil;
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.model.BaseModel;
-import com.liferay.portal.model.impl.BaseModelImpl;
-import com.liferay.portal.util.PortalUtil;
-
-import java.io.Serializable;
-
-import java.lang.reflect.Method;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Ryan Park
- */
-public class AppClp extends BaseModelImpl<App> implements App {
-	public AppClp() {
-	}
-
-	@Override
-	public Class<?> getModelClass() {
-		return App.class;
-	}
-
-	@Override
-	public String getModelClassName() {
-		return App.class.getName();
-	}
-
-	@Override
-	public long getPrimaryKey() {
-		return _appId;
-	}
-
-	@Override
-	public void setPrimaryKey(long primaryKey) {
-		setAppId(primaryKey);
-	}
-
-	@Override
-	public Serializable getPrimaryKeyObj() {
-		return _appId;
-	}
-
-	@Override
-	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
-		setPrimaryKey(((Long)primaryKeyObj).longValue());
-	}
-
-	@Override
-	public Map<String, Object> getModelAttributes() {
-		Map<String, Object> attributes = new HashMap<String, Object>();
-
-		attributes.put("uuid", getUuid());
-		attributes.put("appId", getAppId());
-		attributes.put("companyId", getCompanyId());
-		attributes.put("userId", getUserId());
-		attributes.put("userName", getUserName());
-		attributes.put("createDate", getCreateDate());
-		attributes.put("modifiedDate", getModifiedDate());
-		attributes.put("remoteAppId", getRemoteAppId());
-		attributes.put("title", getTitle());
-		attributes.put("description", getDescription());
-		attributes.put("category", getCategory());
-		attributes.put("iconURL", getIconURL());
-		attributes.put("version", getVersion());
-
-		return attributes;
-	}
-
-	@Override
-	public void setModelAttributes(Map<String, Object> attributes) {
-		String uuid = (String)attributes.get("uuid");
-
-		if (uuid != null) {
-			setUuid(uuid);
-		}
-
-		Long appId = (Long)attributes.get("appId");
-
-		if (appId != null) {
-			setAppId(appId);
-		}
-
-		Long companyId = (Long)attributes.get("companyId");
-
-		if (companyId != null) {
-			setCompanyId(companyId);
-		}
-
-		Long userId = (Long)attributes.get("userId");
-
-		if (userId != null) {
-			setUserId(userId);
-		}
-
-		String userName = (String)attributes.get("userName");
-
-		if (userName != null) {
-			setUserName(userName);
-		}
-
-		Date createDate = (Date)attributes.get("createDate");
-
-		if (createDate != null) {
-			setCreateDate(createDate);
-		}
-
-		Date modifiedDate = (Date)attributes.get("modifiedDate");
-
-		if (modifiedDate != null) {
-			setModifiedDate(modifiedDate);
-		}
-
-		Long remoteAppId = (Long)attributes.get("remoteAppId");
-
-		if (remoteAppId != null) {
-			setRemoteAppId(remoteAppId);
-		}
-
-		String title = (String)attributes.get("title");
-
-		if (title != null) {
-			setTitle(title);
-		}
-
-		String description = (String)attributes.get("description");
-
-		if (description != null) {
-			setDescription(description);
-		}
-
-		String category = (String)attributes.get("category");
-
-		if (category != null) {
-			setCategory(category);
-		}
-
-		String iconURL = (String)attributes.get("iconURL");
-
-		if (iconURL != null) {
-			setIconURL(iconURL);
-		}
-
-		String version = (String)attributes.get("version");
-
-		if (version != null) {
-			setVersion(version);
-		}
-	}
-
-	@Override
-	public String getUuid() {
-		return _uuid;
-	}
-
-	@Override
-	public void setUuid(String uuid) {
-		_uuid = uuid;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setUuid", String.class);
-
-				method.invoke(_appRemoteModel, uuid);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public long getAppId() {
-		return _appId;
-	}
-
-	@Override
-	public void setAppId(long appId) {
-		_appId = appId;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setAppId", long.class);
-
-				method.invoke(_appRemoteModel, appId);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public long getCompanyId() {
-		return _companyId;
-	}
-
-	@Override
-	public void setCompanyId(long companyId) {
-		_companyId = companyId;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setCompanyId", long.class);
-
-				method.invoke(_appRemoteModel, companyId);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public long getUserId() {
-		return _userId;
-	}
-
-	@Override
-	public void setUserId(long userId) {
-		_userId = userId;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setUserId", long.class);
-
-				method.invoke(_appRemoteModel, userId);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getUserUuid() throws SystemException {
-		return PortalUtil.getUserValue(getUserId(), "uuid", _userUuid);
-	}
-
-	@Override
-	public void setUserUuid(String userUuid) {
-		_userUuid = userUuid;
-	}
-
-	@Override
-	public String getUserName() {
-		return _userName;
-	}
-
-	@Override
-	public void setUserName(String userName) {
-		_userName = userName;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setUserName", String.class);
-
-				method.invoke(_appRemoteModel, userName);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public Date getCreateDate() {
-		return _createDate;
-	}
-
-	@Override
-	public void setCreateDate(Date createDate) {
-		_createDate = createDate;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setCreateDate", Date.class);
-
-				method.invoke(_appRemoteModel, createDate);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public Date getModifiedDate() {
-		return _modifiedDate;
-	}
-
-	@Override
-	public void setModifiedDate(Date modifiedDate) {
-		_modifiedDate = modifiedDate;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setModifiedDate", Date.class);
-
-				method.invoke(_appRemoteModel, modifiedDate);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public long getRemoteAppId() {
-		return _remoteAppId;
-	}
-
-	@Override
-	public void setRemoteAppId(long remoteAppId) {
-		_remoteAppId = remoteAppId;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setRemoteAppId", long.class);
-
-				method.invoke(_appRemoteModel, remoteAppId);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getTitle() {
-		return _title;
-	}
-
-	@Override
-	public void setTitle(String title) {
-		_title = title;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setTitle", String.class);
-
-				method.invoke(_appRemoteModel, title);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getDescription() {
-		return _description;
-	}
-
-	@Override
-	public void setDescription(String description) {
-		_description = description;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setDescription", String.class);
-
-				method.invoke(_appRemoteModel, description);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getCategory() {
-		return _category;
-	}
-
-	@Override
-	public void setCategory(String category) {
-		_category = category;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setCategory", String.class);
-
-				method.invoke(_appRemoteModel, category);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getIconURL() {
-		return _iconURL;
-	}
-
-	@Override
-	public void setIconURL(String iconURL) {
-		_iconURL = iconURL;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setIconURL", String.class);
-
-				method.invoke(_appRemoteModel, iconURL);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getVersion() {
-		return _version;
-	}
-
-	@Override
-	public void setVersion(String version) {
-		_version = version;
-
-		if (_appRemoteModel != null) {
-			try {
-				Class<?> clazz = _appRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setVersion", String.class);
-
-				method.invoke(_appRemoteModel, version);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public boolean isDownloaded() {
-		try {
-			String methodName = "isDownloaded";
-
-			Class<?>[] parameterTypes = new Class<?>[] {  };
-
-			Object[] parameterValues = new Object[] {  };
-
-			Boolean returnObj = (Boolean)invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public java.lang.String getFileDir() {
-		try {
-			String methodName = "getFileDir";
-
-			Class<?>[] parameterTypes = new Class<?>[] {  };
-
-			Object[] parameterValues = new Object[] {  };
-
-			java.lang.String returnObj = (java.lang.String)invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public java.lang.String getFileName() {
-		try {
-			String methodName = "getFileName";
-
-			Class<?>[] parameterTypes = new Class<?>[] {  };
-
-			Object[] parameterValues = new Object[] {  };
-
-			java.lang.String returnObj = (java.lang.String)invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public boolean isInstalled() {
-		try {
-			String methodName = "isInstalled";
-
-			Class<?>[] parameterTypes = new Class<?>[] {  };
-
-			Object[] parameterValues = new Object[] {  };
-
-			Boolean returnObj = (Boolean)invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public java.lang.String[] addContextName(java.lang.String contextName) {
-		try {
-			String methodName = "addContextName";
-
-			Class<?>[] parameterTypes = new Class<?>[] { java.lang.String.class };
-
-			Object[] parameterValues = new Object[] { contextName };
-
-			java.lang.String[] returnObj = (java.lang.String[])invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public java.lang.String[] getContextNames() {
-		try {
-			String methodName = "getContextNames";
-
-			Class<?>[] parameterTypes = new Class<?>[] {  };
-
-			Object[] parameterValues = new Object[] {  };
-
-			java.lang.String[] returnObj = (java.lang.String[])invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public java.lang.String getFilePath() {
-		try {
-			String methodName = "getFilePath";
-
-			Class<?>[] parameterTypes = new Class<?>[] {  };
-
-			Object[] parameterValues = new Object[] {  };
-
-			java.lang.String returnObj = (java.lang.String)invokeOnRemoteModel(methodName,
-					parameterTypes, parameterValues);
-
-			return returnObj;
-		}
-		catch (Exception e) {
-			throw new UnsupportedOperationException(e);
-		}
-	}
-
-	@Override
-	public StagedModelType getStagedModelType() {
-		return new StagedModelType(PortalUtil.getClassNameId(
-				App.class.getName()));
-	}
-
-	public BaseModel<?> getAppRemoteModel() {
-		return _appRemoteModel;
-	}
-
-	public void setAppRemoteModel(BaseModel<?> appRemoteModel) {
-		_appRemoteModel = appRemoteModel;
-	}
-
-	public Object invokeOnRemoteModel(String methodName,
-		Class<?>[] parameterTypes, Object[] parameterValues)
-		throws Exception {
-		Object[] remoteParameterValues = new Object[parameterValues.length];
-
-		for (int i = 0; i < parameterValues.length; i++) {
-			if (parameterValues[i] != null) {
-				remoteParameterValues[i] = ClpSerializer.translateInput(parameterValues[i]);
-			}
-		}
-
-		Class<?> remoteModelClass = _appRemoteModel.getClass();
-
-		ClassLoader remoteModelClassLoader = remoteModelClass.getClassLoader();
-
-		Class<?>[] remoteParameterTypes = new Class[parameterTypes.length];
-
-		for (int i = 0; i < parameterTypes.length; i++) {
-			if (parameterTypes[i].isPrimitive()) {
-				remoteParameterTypes[i] = parameterTypes[i];
-			}
-			else {
-				String parameterTypeName = parameterTypes[i].getName();
-
-				remoteParameterTypes[i] = remoteModelClassLoader.loadClass(parameterTypeName);
-			}
-		}
-
-		Method method = remoteModelClass.getMethod(methodName,
-				remoteParameterTypes);
-
-		Object returnValue = method.invoke(_appRemoteModel,
-				remoteParameterValues);
-
-		if (returnValue != null) {
-			returnValue = ClpSerializer.translateOutput(returnValue);
-		}
-
-		return returnValue;
-	}
-
-	@Override
-	public void persist() throws SystemException {
-		if (this.isNew()) {
-			AppLocalServiceUtil.addApp(this);
-		}
-		else {
-			AppLocalServiceUtil.updateApp(this);
-		}
-	}
-
-	@Override
-	public App toEscapedModel() {
-		return (App)ProxyUtil.newProxyInstance(App.class.getClassLoader(),
-			new Class[] { App.class }, new AutoEscapeBeanHandler(this));
-	}
-
-	@Override
-	public Object clone() {
-		AppClp clone = new AppClp();
-
-		clone.setUuid(getUuid());
-		clone.setAppId(getAppId());
-		clone.setCompanyId(getCompanyId());
-		clone.setUserId(getUserId());
-		clone.setUserName(getUserName());
-		clone.setCreateDate(getCreateDate());
-		clone.setModifiedDate(getModifiedDate());
-		clone.setRemoteAppId(getRemoteAppId());
-		clone.setTitle(getTitle());
-		clone.setDescription(getDescription());
-		clone.setCategory(getCategory());
-		clone.setIconURL(getIconURL());
-		clone.setVersion(getVersion());
-
-		return clone;
-	}
-
-	@Override
-	public int compareTo(App app) {
-		long primaryKey = app.getPrimaryKey();
-
-		if (getPrimaryKey() < primaryKey) {
-			return -1;
-		}
-		else if (getPrimaryKey() > primaryKey) {
-			return 1;
-		}
-		else {
-			return 0;
-		}
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-
-		if (!(obj instanceof AppClp)) {
-			return false;
-		}
-
-		AppClp app = (AppClp)obj;
-
-		long primaryKey = app.getPrimaryKey();
-
-		if (getPrimaryKey() == primaryKey) {
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-
-	@Override
-	public int hashCode() {
-		return (int)getPrimaryKey();
-	}
-
-	@Override
-	public String toString() {
-		StringBundler sb = new StringBundler(27);
-
-		sb.append("{uuid=");
-		sb.append(getUuid());
-		sb.append(", appId=");
-		sb.append(getAppId());
-		sb.append(", companyId=");
-		sb.append(getCompanyId());
-		sb.append(", userId=");
-		sb.append(getUserId());
-		sb.append(", userName=");
-		sb.append(getUserName());
-		sb.append(", createDate=");
-		sb.append(getCreateDate());
-		sb.append(", modifiedDate=");
-		sb.append(getModifiedDate());
-		sb.append(", remoteAppId=");
-		sb.append(getRemoteAppId());
-		sb.append(", title=");
-		sb.append(getTitle());
-		sb.append(", description=");
-		sb.append(getDescription());
-		sb.append(", category=");
-		sb.append(getCategory());
-		sb.append(", iconURL=");
-		sb.append(getIconURL());
-		sb.append(", version=");
-		sb.append(getVersion());
-		sb.append("}");
-
-		return sb.toString();
-	}
-
-	@Override
-	public String toXmlString() {
-		StringBundler sb = new StringBundler(43);
-
-		sb.append("<model><model-name>");
-		sb.append("com.liferay.marketplace.model.App");
-		sb.append("</model-name>");
-
-		sb.append(
-			"<column><column-name>uuid</column-name><column-value><![CDATA[");
-		sb.append(getUuid());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>appId</column-name><column-value><![CDATA[");
-		sb.append(getAppId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>companyId</column-name><column-value><![CDATA[");
-		sb.append(getCompanyId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>userId</column-name><column-value><![CDATA[");
-		sb.append(getUserId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>userName</column-name><column-value><![CDATA[");
-		sb.append(getUserName());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>createDate</column-name><column-value><![CDATA[");
-		sb.append(getCreateDate());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>modifiedDate</column-name><column-value><![CDATA[");
-		sb.append(getModifiedDate());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>remoteAppId</column-name><column-value><![CDATA[");
-		sb.append(getRemoteAppId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>title</column-name><column-value><![CDATA[");
-		sb.append(getTitle());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>description</column-name><column-value><![CDATA[");
-		sb.append(getDescription());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>category</column-name><column-value><![CDATA[");
-		sb.append(getCategory());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>iconURL</column-name><column-value><![CDATA[");
-		sb.append(getIconURL());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>version</column-name><column-value><![CDATA[");
-		sb.append(getVersion());
-		sb.append("]]></column-value></column>");
-
-		sb.append("</model>");
-
-		return sb.toString();
-	}
-
-	private String _uuid;
-	private long _appId;
-	private long _companyId;
-	private long _userId;
-	private String _userUuid;
-	private String _userName;
-	private Date _createDate;
-	private Date _modifiedDate;
-	private long _remoteAppId;
-	private String _title;
-	private String _description;
-	private String _category;
-	private String _iconURL;
-	private String _version;
-	private BaseModel<?> _appRemoteModel;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppModel.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppModel.java
deleted file mode 100644
index 8173795..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppModel.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.portal.kernel.bean.AutoEscape;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.model.BaseModel;
-import com.liferay.portal.model.CacheModel;
-import com.liferay.portal.model.StagedAuditedModel;
-import com.liferay.portal.service.ServiceContext;
-
-import com.liferay.portlet.expando.model.ExpandoBridge;
-
-import java.io.Serializable;
-
-import java.util.Date;
-
-/**
- * The base model interface for the App service. Represents a row in the &quot;Marketplace_App&quot; database table, with each column mapped to a property of this class.
- *
- * <p>
- * This interface and its corresponding implementation {@link com.liferay.marketplace.model.impl.AppModelImpl} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link com.liferay.marketplace.model.impl.AppImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see App
- * @see com.liferay.marketplace.model.impl.AppImpl
- * @see com.liferay.marketplace.model.impl.AppModelImpl
- * @generated
- */
-public interface AppModel extends BaseModel<App>, StagedAuditedModel {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. All methods that expect a app model instance should use the {@link App} interface instead.
-	 */
-
-	/**
-	 * Returns the primary key of this app.
-	 *
-	 * @return the primary key of this app
-	 */
-	public long getPrimaryKey();
-
-	/**
-	 * Sets the primary key of this app.
-	 *
-	 * @param primaryKey the primary key of this app
-	 */
-	public void setPrimaryKey(long primaryKey);
-
-	/**
-	 * Returns the uuid of this app.
-	 *
-	 * @return the uuid of this app
-	 */
-	@AutoEscape
-	@Override
-	public String getUuid();
-
-	/**
-	 * Sets the uuid of this app.
-	 *
-	 * @param uuid the uuid of this app
-	 */
-	@Override
-	public void setUuid(String uuid);
-
-	/**
-	 * Returns the app ID of this app.
-	 *
-	 * @return the app ID of this app
-	 */
-	public long getAppId();
-
-	/**
-	 * Sets the app ID of this app.
-	 *
-	 * @param appId the app ID of this app
-	 */
-	public void setAppId(long appId);
-
-	/**
-	 * Returns the company ID of this app.
-	 *
-	 * @return the company ID of this app
-	 */
-	@Override
-	public long getCompanyId();
-
-	/**
-	 * Sets the company ID of this app.
-	 *
-	 * @param companyId the company ID of this app
-	 */
-	@Override
-	public void setCompanyId(long companyId);
-
-	/**
-	 * Returns the user ID of this app.
-	 *
-	 * @return the user ID of this app
-	 */
-	@Override
-	public long getUserId();
-
-	/**
-	 * Sets the user ID of this app.
-	 *
-	 * @param userId the user ID of this app
-	 */
-	@Override
-	public void setUserId(long userId);
-
-	/**
-	 * Returns the user uuid of this app.
-	 *
-	 * @return the user uuid of this app
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public String getUserUuid() throws SystemException;
-
-	/**
-	 * Sets the user uuid of this app.
-	 *
-	 * @param userUuid the user uuid of this app
-	 */
-	@Override
-	public void setUserUuid(String userUuid);
-
-	/**
-	 * Returns the user name of this app.
-	 *
-	 * @return the user name of this app
-	 */
-	@AutoEscape
-	@Override
-	public String getUserName();
-
-	/**
-	 * Sets the user name of this app.
-	 *
-	 * @param userName the user name of this app
-	 */
-	@Override
-	public void setUserName(String userName);
-
-	/**
-	 * Returns the create date of this app.
-	 *
-	 * @return the create date of this app
-	 */
-	@Override
-	public Date getCreateDate();
-
-	/**
-	 * Sets the create date of this app.
-	 *
-	 * @param createDate the create date of this app
-	 */
-	@Override
-	public void setCreateDate(Date createDate);
-
-	/**
-	 * Returns the modified date of this app.
-	 *
-	 * @return the modified date of this app
-	 */
-	@Override
-	public Date getModifiedDate();
-
-	/**
-	 * Sets the modified date of this app.
-	 *
-	 * @param modifiedDate the modified date of this app
-	 */
-	@Override
-	public void setModifiedDate(Date modifiedDate);
-
-	/**
-	 * Returns the remote app ID of this app.
-	 *
-	 * @return the remote app ID of this app
-	 */
-	public long getRemoteAppId();
-
-	/**
-	 * Sets the remote app ID of this app.
-	 *
-	 * @param remoteAppId the remote app ID of this app
-	 */
-	public void setRemoteAppId(long remoteAppId);
-
-	/**
-	 * Returns the title of this app.
-	 *
-	 * @return the title of this app
-	 */
-	@AutoEscape
-	public String getTitle();
-
-	/**
-	 * Sets the title of this app.
-	 *
-	 * @param title the title of this app
-	 */
-	public void setTitle(String title);
-
-	/**
-	 * Returns the description of this app.
-	 *
-	 * @return the description of this app
-	 */
-	@AutoEscape
-	public String getDescription();
-
-	/**
-	 * Sets the description of this app.
-	 *
-	 * @param description the description of this app
-	 */
-	public void setDescription(String description);
-
-	/**
-	 * Returns the category of this app.
-	 *
-	 * @return the category of this app
-	 */
-	@AutoEscape
-	public String getCategory();
-
-	/**
-	 * Sets the category of this app.
-	 *
-	 * @param category the category of this app
-	 */
-	public void setCategory(String category);
-
-	/**
-	 * Returns the icon u r l of this app.
-	 *
-	 * @return the icon u r l of this app
-	 */
-	@AutoEscape
-	public String getIconURL();
-
-	/**
-	 * Sets the icon u r l of this app.
-	 *
-	 * @param iconURL the icon u r l of this app
-	 */
-	public void setIconURL(String iconURL);
-
-	/**
-	 * Returns the version of this app.
-	 *
-	 * @return the version of this app
-	 */
-	@AutoEscape
-	public String getVersion();
-
-	/**
-	 * Sets the version of this app.
-	 *
-	 * @param version the version of this app
-	 */
-	public void setVersion(String version);
-
-	@Override
-	public boolean isNew();
-
-	@Override
-	public void setNew(boolean n);
-
-	@Override
-	public boolean isCachedModel();
-
-	@Override
-	public void setCachedModel(boolean cachedModel);
-
-	@Override
-	public boolean isEscapedModel();
-
-	@Override
-	public Serializable getPrimaryKeyObj();
-
-	@Override
-	public void setPrimaryKeyObj(Serializable primaryKeyObj);
-
-	@Override
-	public ExpandoBridge getExpandoBridge();
-
-	@Override
-	public void setExpandoBridgeAttributes(BaseModel<?> baseModel);
-
-	@Override
-	public void setExpandoBridgeAttributes(ExpandoBridge expandoBridge);
-
-	@Override
-	public void setExpandoBridgeAttributes(ServiceContext serviceContext);
-
-	@Override
-	public Object clone();
-
-	@Override
-	public int compareTo(App app);
-
-	@Override
-	public int hashCode();
-
-	@Override
-	public CacheModel<App> toCacheModel();
-
-	@Override
-	public App toEscapedModel();
-
-	@Override
-	public App toUnescapedModel();
-
-	@Override
-	public String toString();
-
-	@Override
-	public String toXmlString();
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppSoap.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppSoap.java
deleted file mode 100644
index c22f109..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppSoap.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-/**
- * This class is used by SOAP remote services, specifically {@link com.liferay.marketplace.service.http.AppServiceSoap}.
- *
- * @author Ryan Park
- * @see com.liferay.marketplace.service.http.AppServiceSoap
- * @generated
- */
-public class AppSoap implements Serializable {
-	public static AppSoap toSoapModel(App model) {
-		AppSoap soapModel = new AppSoap();
-
-		soapModel.setUuid(model.getUuid());
-		soapModel.setAppId(model.getAppId());
-		soapModel.setCompanyId(model.getCompanyId());
-		soapModel.setUserId(model.getUserId());
-		soapModel.setUserName(model.getUserName());
-		soapModel.setCreateDate(model.getCreateDate());
-		soapModel.setModifiedDate(model.getModifiedDate());
-		soapModel.setRemoteAppId(model.getRemoteAppId());
-		soapModel.setTitle(model.getTitle());
-		soapModel.setDescription(model.getDescription());
-		soapModel.setCategory(model.getCategory());
-		soapModel.setIconURL(model.getIconURL());
-		soapModel.setVersion(model.getVersion());
-
-		return soapModel;
-	}
-
-	public static AppSoap[] toSoapModels(App[] models) {
-		AppSoap[] soapModels = new AppSoap[models.length];
-
-		for (int i = 0; i < models.length; i++) {
-			soapModels[i] = toSoapModel(models[i]);
-		}
-
-		return soapModels;
-	}
-
-	public static AppSoap[][] toSoapModels(App[][] models) {
-		AppSoap[][] soapModels = null;
-
-		if (models.length > 0) {
-			soapModels = new AppSoap[models.length][models[0].length];
-		}
-		else {
-			soapModels = new AppSoap[0][0];
-		}
-
-		for (int i = 0; i < models.length; i++) {
-			soapModels[i] = toSoapModels(models[i]);
-		}
-
-		return soapModels;
-	}
-
-	public static AppSoap[] toSoapModels(List<App> models) {
-		List<AppSoap> soapModels = new ArrayList<AppSoap>(models.size());
-
-		for (App model : models) {
-			soapModels.add(toSoapModel(model));
-		}
-
-		return soapModels.toArray(new AppSoap[soapModels.size()]);
-	}
-
-	public AppSoap() {
-	}
-
-	public long getPrimaryKey() {
-		return _appId;
-	}
-
-	public void setPrimaryKey(long pk) {
-		setAppId(pk);
-	}
-
-	public String getUuid() {
-		return _uuid;
-	}
-
-	public void setUuid(String uuid) {
-		_uuid = uuid;
-	}
-
-	public long getAppId() {
-		return _appId;
-	}
-
-	public void setAppId(long appId) {
-		_appId = appId;
-	}
-
-	public long getCompanyId() {
-		return _companyId;
-	}
-
-	public void setCompanyId(long companyId) {
-		_companyId = companyId;
-	}
-
-	public long getUserId() {
-		return _userId;
-	}
-
-	public void setUserId(long userId) {
-		_userId = userId;
-	}
-
-	public String getUserName() {
-		return _userName;
-	}
-
-	public void setUserName(String userName) {
-		_userName = userName;
-	}
-
-	public Date getCreateDate() {
-		return _createDate;
-	}
-
-	public void setCreateDate(Date createDate) {
-		_createDate = createDate;
-	}
-
-	public Date getModifiedDate() {
-		return _modifiedDate;
-	}
-
-	public void setModifiedDate(Date modifiedDate) {
-		_modifiedDate = modifiedDate;
-	}
-
-	public long getRemoteAppId() {
-		return _remoteAppId;
-	}
-
-	public void setRemoteAppId(long remoteAppId) {
-		_remoteAppId = remoteAppId;
-	}
-
-	public String getTitle() {
-		return _title;
-	}
-
-	public void setTitle(String title) {
-		_title = title;
-	}
-
-	public String getDescription() {
-		return _description;
-	}
-
-	public void setDescription(String description) {
-		_description = description;
-	}
-
-	public String getCategory() {
-		return _category;
-	}
-
-	public void setCategory(String category) {
-		_category = category;
-	}
-
-	public String getIconURL() {
-		return _iconURL;
-	}
-
-	public void setIconURL(String iconURL) {
-		_iconURL = iconURL;
-	}
-
-	public String getVersion() {
-		return _version;
-	}
-
-	public void setVersion(String version) {
-		_version = version;
-	}
-
-	private String _uuid;
-	private long _appId;
-	private long _companyId;
-	private long _userId;
-	private String _userName;
-	private Date _createDate;
-	private Date _modifiedDate;
-	private long _remoteAppId;
-	private String _title;
-	private String _description;
-	private String _category;
-	private String _iconURL;
-	private String _version;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppWrapper.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppWrapper.java
deleted file mode 100644
index 5a85965..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/AppWrapper.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.portal.kernel.lar.StagedModelType;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.model.ModelWrapper;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * <p>
- * This class is a wrapper for {@link App}.
- * </p>
- *
- * @author Ryan Park
- * @see App
- * @generated
- */
-public class AppWrapper implements App, ModelWrapper<App> {
-	public AppWrapper(App app) {
-		_app = app;
-	}
-
-	@Override
-	public Class<?> getModelClass() {
-		return App.class;
-	}
-
-	@Override
-	public String getModelClassName() {
-		return App.class.getName();
-	}
-
-	@Override
-	public Map<String, Object> getModelAttributes() {
-		Map<String, Object> attributes = new HashMap<String, Object>();
-
-		attributes.put("uuid", getUuid());
-		attributes.put("appId", getAppId());
-		attributes.put("companyId", getCompanyId());
-		attributes.put("userId", getUserId());
-		attributes.put("userName", getUserName());
-		attributes.put("createDate", getCreateDate());
-		attributes.put("modifiedDate", getModifiedDate());
-		attributes.put("remoteAppId", getRemoteAppId());
-		attributes.put("title", getTitle());
-		attributes.put("description", getDescription());
-		attributes.put("category", getCategory());
-		attributes.put("iconURL", getIconURL());
-		attributes.put("version", getVersion());
-
-		return attributes;
-	}
-
-	@Override
-	public void setModelAttributes(Map<String, Object> attributes) {
-		String uuid = (String)attributes.get("uuid");
-
-		if (uuid != null) {
-			setUuid(uuid);
-		}
-
-		Long appId = (Long)attributes.get("appId");
-
-		if (appId != null) {
-			setAppId(appId);
-		}
-
-		Long companyId = (Long)attributes.get("companyId");
-
-		if (companyId != null) {
-			setCompanyId(companyId);
-		}
-
-		Long userId = (Long)attributes.get("userId");
-
-		if (userId != null) {
-			setUserId(userId);
-		}
-
-		String userName = (String)attributes.get("userName");
-
-		if (userName != null) {
-			setUserName(userName);
-		}
-
-		Date createDate = (Date)attributes.get("createDate");
-
-		if (createDate != null) {
-			setCreateDate(createDate);
-		}
-
-		Date modifiedDate = (Date)attributes.get("modifiedDate");
-
-		if (modifiedDate != null) {
-			setModifiedDate(modifiedDate);
-		}
-
-		Long remoteAppId = (Long)attributes.get("remoteAppId");
-
-		if (remoteAppId != null) {
-			setRemoteAppId(remoteAppId);
-		}
-
-		String title = (String)attributes.get("title");
-
-		if (title != null) {
-			setTitle(title);
-		}
-
-		String description = (String)attributes.get("description");
-
-		if (description != null) {
-			setDescription(description);
-		}
-
-		String category = (String)attributes.get("category");
-
-		if (category != null) {
-			setCategory(category);
-		}
-
-		String iconURL = (String)attributes.get("iconURL");
-
-		if (iconURL != null) {
-			setIconURL(iconURL);
-		}
-
-		String version = (String)attributes.get("version");
-
-		if (version != null) {
-			setVersion(version);
-		}
-	}
-
-	/**
-	* Returns the primary key of this app.
-	*
-	* @return the primary key of this app
-	*/
-	@Override
-	public long getPrimaryKey() {
-		return _app.getPrimaryKey();
-	}
-
-	/**
-	* Sets the primary key of this app.
-	*
-	* @param primaryKey the primary key of this app
-	*/
-	@Override
-	public void setPrimaryKey(long primaryKey) {
-		_app.setPrimaryKey(primaryKey);
-	}
-
-	/**
-	* Returns the uuid of this app.
-	*
-	* @return the uuid of this app
-	*/
-	@Override
-	public java.lang.String getUuid() {
-		return _app.getUuid();
-	}
-
-	/**
-	* Sets the uuid of this app.
-	*
-	* @param uuid the uuid of this app
-	*/
-	@Override
-	public void setUuid(java.lang.String uuid) {
-		_app.setUuid(uuid);
-	}
-
-	/**
-	* Returns the app ID of this app.
-	*
-	* @return the app ID of this app
-	*/
-	@Override
-	public long getAppId() {
-		return _app.getAppId();
-	}
-
-	/**
-	* Sets the app ID of this app.
-	*
-	* @param appId the app ID of this app
-	*/
-	@Override
-	public void setAppId(long appId) {
-		_app.setAppId(appId);
-	}
-
-	/**
-	* Returns the company ID of this app.
-	*
-	* @return the company ID of this app
-	*/
-	@Override
-	public long getCompanyId() {
-		return _app.getCompanyId();
-	}
-
-	/**
-	* Sets the company ID of this app.
-	*
-	* @param companyId the company ID of this app
-	*/
-	@Override
-	public void setCompanyId(long companyId) {
-		_app.setCompanyId(companyId);
-	}
-
-	/**
-	* Returns the user ID of this app.
-	*
-	* @return the user ID of this app
-	*/
-	@Override
-	public long getUserId() {
-		return _app.getUserId();
-	}
-
-	/**
-	* Sets the user ID of this app.
-	*
-	* @param userId the user ID of this app
-	*/
-	@Override
-	public void setUserId(long userId) {
-		_app.setUserId(userId);
-	}
-
-	/**
-	* Returns the user uuid of this app.
-	*
-	* @return the user uuid of this app
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public java.lang.String getUserUuid()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _app.getUserUuid();
-	}
-
-	/**
-	* Sets the user uuid of this app.
-	*
-	* @param userUuid the user uuid of this app
-	*/
-	@Override
-	public void setUserUuid(java.lang.String userUuid) {
-		_app.setUserUuid(userUuid);
-	}
-
-	/**
-	* Returns the user name of this app.
-	*
-	* @return the user name of this app
-	*/
-	@Override
-	public java.lang.String getUserName() {
-		return _app.getUserName();
-	}
-
-	/**
-	* Sets the user name of this app.
-	*
-	* @param userName the user name of this app
-	*/
-	@Override
-	public void setUserName(java.lang.String userName) {
-		_app.setUserName(userName);
-	}
-
-	/**
-	* Returns the create date of this app.
-	*
-	* @return the create date of this app
-	*/
-	@Override
-	public java.util.Date getCreateDate() {
-		return _app.getCreateDate();
-	}
-
-	/**
-	* Sets the create date of this app.
-	*
-	* @param createDate the create date of this app
-	*/
-	@Override
-	public void setCreateDate(java.util.Date createDate) {
-		_app.setCreateDate(createDate);
-	}
-
-	/**
-	* Returns the modified date of this app.
-	*
-	* @return the modified date of this app
-	*/
-	@Override
-	public java.util.Date getModifiedDate() {
-		return _app.getModifiedDate();
-	}
-
-	/**
-	* Sets the modified date of this app.
-	*
-	* @param modifiedDate the modified date of this app
-	*/
-	@Override
-	public void setModifiedDate(java.util.Date modifiedDate) {
-		_app.setModifiedDate(modifiedDate);
-	}
-
-	/**
-	* Returns the remote app ID of this app.
-	*
-	* @return the remote app ID of this app
-	*/
-	@Override
-	public long getRemoteAppId() {
-		return _app.getRemoteAppId();
-	}
-
-	/**
-	* Sets the remote app ID of this app.
-	*
-	* @param remoteAppId the remote app ID of this app
-	*/
-	@Override
-	public void setRemoteAppId(long remoteAppId) {
-		_app.setRemoteAppId(remoteAppId);
-	}
-
-	/**
-	* Returns the title of this app.
-	*
-	* @return the title of this app
-	*/
-	@Override
-	public java.lang.String getTitle() {
-		return _app.getTitle();
-	}
-
-	/**
-	* Sets the title of this app.
-	*
-	* @param title the title of this app
-	*/
-	@Override
-	public void setTitle(java.lang.String title) {
-		_app.setTitle(title);
-	}
-
-	/**
-	* Returns the description of this app.
-	*
-	* @return the description of this app
-	*/
-	@Override
-	public java.lang.String getDescription() {
-		return _app.getDescription();
-	}
-
-	/**
-	* Sets the description of this app.
-	*
-	* @param description the description of this app
-	*/
-	@Override
-	public void setDescription(java.lang.String description) {
-		_app.setDescription(description);
-	}
-
-	/**
-	* Returns the category of this app.
-	*
-	* @return the category of this app
-	*/
-	@Override
-	public java.lang.String getCategory() {
-		return _app.getCategory();
-	}
-
-	/**
-	* Sets the category of this app.
-	*
-	* @param category the category of this app
-	*/
-	@Override
-	public void setCategory(java.lang.String category) {
-		_app.setCategory(category);
-	}
-
-	/**
-	* Returns the icon u r l of this app.
-	*
-	* @return the icon u r l of this app
-	*/
-	@Override
-	public java.lang.String getIconURL() {
-		return _app.getIconURL();
-	}
-
-	/**
-	* Sets the icon u r l of this app.
-	*
-	* @param iconURL the icon u r l of this app
-	*/
-	@Override
-	public void setIconURL(java.lang.String iconURL) {
-		_app.setIconURL(iconURL);
-	}
-
-	/**
-	* Returns the version of this app.
-	*
-	* @return the version of this app
-	*/
-	@Override
-	public java.lang.String getVersion() {
-		return _app.getVersion();
-	}
-
-	/**
-	* Sets the version of this app.
-	*
-	* @param version the version of this app
-	*/
-	@Override
-	public void setVersion(java.lang.String version) {
-		_app.setVersion(version);
-	}
-
-	@Override
-	public boolean isNew() {
-		return _app.isNew();
-	}
-
-	@Override
-	public void setNew(boolean n) {
-		_app.setNew(n);
-	}
-
-	@Override
-	public boolean isCachedModel() {
-		return _app.isCachedModel();
-	}
-
-	@Override
-	public void setCachedModel(boolean cachedModel) {
-		_app.setCachedModel(cachedModel);
-	}
-
-	@Override
-	public boolean isEscapedModel() {
-		return _app.isEscapedModel();
-	}
-
-	@Override
-	public java.io.Serializable getPrimaryKeyObj() {
-		return _app.getPrimaryKeyObj();
-	}
-
-	@Override
-	public void setPrimaryKeyObj(java.io.Serializable primaryKeyObj) {
-		_app.setPrimaryKeyObj(primaryKeyObj);
-	}
-
-	@Override
-	public com.liferay.portlet.expando.model.ExpandoBridge getExpandoBridge() {
-		return _app.getExpandoBridge();
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(
-		com.liferay.portal.model.BaseModel<?> baseModel) {
-		_app.setExpandoBridgeAttributes(baseModel);
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(
-		com.liferay.portlet.expando.model.ExpandoBridge expandoBridge) {
-		_app.setExpandoBridgeAttributes(expandoBridge);
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(
-		com.liferay.portal.service.ServiceContext serviceContext) {
-		_app.setExpandoBridgeAttributes(serviceContext);
-	}
-
-	@Override
-	public java.lang.Object clone() {
-		return new AppWrapper((App)_app.clone());
-	}
-
-	@Override
-	public int compareTo(com.liferay.marketplace.model.App app) {
-		return _app.compareTo(app);
-	}
-
-	@Override
-	public int hashCode() {
-		return _app.hashCode();
-	}
-
-	@Override
-	public com.liferay.portal.model.CacheModel<com.liferay.marketplace.model.App> toCacheModel() {
-		return _app.toCacheModel();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App toEscapedModel() {
-		return new AppWrapper(_app.toEscapedModel());
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App toUnescapedModel() {
-		return new AppWrapper(_app.toUnescapedModel());
-	}
-
-	@Override
-	public java.lang.String toString() {
-		return _app.toString();
-	}
-
-	@Override
-	public java.lang.String toXmlString() {
-		return _app.toXmlString();
-	}
-
-	@Override
-	public void persist()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		_app.persist();
-	}
-
-	@Override
-	public java.lang.String[] addContextName(java.lang.String contextName) {
-		return _app.addContextName(contextName);
-	}
-
-	@Override
-	public java.lang.String[] getContextNames()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _app.getContextNames();
-	}
-
-	@Override
-	public java.lang.String getFileDir() {
-		return _app.getFileDir();
-	}
-
-	@Override
-	public java.lang.String getFileName() {
-		return _app.getFileName();
-	}
-
-	@Override
-	public java.lang.String getFilePath() {
-		return _app.getFilePath();
-	}
-
-	@Override
-	public boolean isDownloaded()
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _app.isDownloaded();
-	}
-
-	@Override
-	public boolean isInstalled()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _app.isInstalled();
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-
-		if (!(obj instanceof AppWrapper)) {
-			return false;
-		}
-
-		AppWrapper appWrapper = (AppWrapper)obj;
-
-		if (Validator.equals(_app, appWrapper._app)) {
-			return true;
-		}
-
-		return false;
-	}
-
-	@Override
-	public StagedModelType getStagedModelType() {
-		return _app.getStagedModelType();
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #getWrappedModel}
-	 */
-	public App getWrappedApp() {
-		return _app;
-	}
-
-	@Override
-	public App getWrappedModel() {
-		return _app;
-	}
-
-	@Override
-	public void resetOriginalValues() {
-		_app.resetOriginalValues();
-	}
-
-	private App _app;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/Module.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/Module.java
deleted file mode 100644
index 7509327..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/Module.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.portal.model.PersistedModel;
-
-/**
- * The extended model interface for the Module service. Represents a row in the &quot;Marketplace_Module&quot; database table, with each column mapped to a property of this class.
- *
- * @author Ryan Park
- * @see ModuleModel
- * @see com.liferay.marketplace.model.impl.ModuleImpl
- * @see com.liferay.marketplace.model.impl.ModuleModelImpl
- * @generated
- */
-public interface Module extends ModuleModel, PersistedModel {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this interface directly. Add methods to {@link com.liferay.marketplace.model.impl.ModuleImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
-	 */
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleClp.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleClp.java
deleted file mode 100644
index c0f4db0..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleClp.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.marketplace.service.ClpSerializer;
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-
-import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.util.ProxyUtil;
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.model.BaseModel;
-import com.liferay.portal.model.impl.BaseModelImpl;
-
-import java.io.Serializable;
-
-import java.lang.reflect.Method;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Ryan Park
- */
-public class ModuleClp extends BaseModelImpl<Module> implements Module {
-	public ModuleClp() {
-	}
-
-	@Override
-	public Class<?> getModelClass() {
-		return Module.class;
-	}
-
-	@Override
-	public String getModelClassName() {
-		return Module.class.getName();
-	}
-
-	@Override
-	public long getPrimaryKey() {
-		return _moduleId;
-	}
-
-	@Override
-	public void setPrimaryKey(long primaryKey) {
-		setModuleId(primaryKey);
-	}
-
-	@Override
-	public Serializable getPrimaryKeyObj() {
-		return _moduleId;
-	}
-
-	@Override
-	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
-		setPrimaryKey(((Long)primaryKeyObj).longValue());
-	}
-
-	@Override
-	public Map<String, Object> getModelAttributes() {
-		Map<String, Object> attributes = new HashMap<String, Object>();
-
-		attributes.put("uuid", getUuid());
-		attributes.put("moduleId", getModuleId());
-		attributes.put("appId", getAppId());
-		attributes.put("contextName", getContextName());
-
-		return attributes;
-	}
-
-	@Override
-	public void setModelAttributes(Map<String, Object> attributes) {
-		String uuid = (String)attributes.get("uuid");
-
-		if (uuid != null) {
-			setUuid(uuid);
-		}
-
-		Long moduleId = (Long)attributes.get("moduleId");
-
-		if (moduleId != null) {
-			setModuleId(moduleId);
-		}
-
-		Long appId = (Long)attributes.get("appId");
-
-		if (appId != null) {
-			setAppId(appId);
-		}
-
-		String contextName = (String)attributes.get("contextName");
-
-		if (contextName != null) {
-			setContextName(contextName);
-		}
-	}
-
-	@Override
-	public String getUuid() {
-		return _uuid;
-	}
-
-	@Override
-	public void setUuid(String uuid) {
-		_uuid = uuid;
-
-		if (_moduleRemoteModel != null) {
-			try {
-				Class<?> clazz = _moduleRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setUuid", String.class);
-
-				method.invoke(_moduleRemoteModel, uuid);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public long getModuleId() {
-		return _moduleId;
-	}
-
-	@Override
-	public void setModuleId(long moduleId) {
-		_moduleId = moduleId;
-
-		if (_moduleRemoteModel != null) {
-			try {
-				Class<?> clazz = _moduleRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setModuleId", long.class);
-
-				method.invoke(_moduleRemoteModel, moduleId);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public long getAppId() {
-		return _appId;
-	}
-
-	@Override
-	public void setAppId(long appId) {
-		_appId = appId;
-
-		if (_moduleRemoteModel != null) {
-			try {
-				Class<?> clazz = _moduleRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setAppId", long.class);
-
-				method.invoke(_moduleRemoteModel, appId);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public String getContextName() {
-		return _contextName;
-	}
-
-	@Override
-	public void setContextName(String contextName) {
-		_contextName = contextName;
-
-		if (_moduleRemoteModel != null) {
-			try {
-				Class<?> clazz = _moduleRemoteModel.getClass();
-
-				Method method = clazz.getMethod("setContextName", String.class);
-
-				method.invoke(_moduleRemoteModel, contextName);
-			}
-			catch (Exception e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	public BaseModel<?> getModuleRemoteModel() {
-		return _moduleRemoteModel;
-	}
-
-	public void setModuleRemoteModel(BaseModel<?> moduleRemoteModel) {
-		_moduleRemoteModel = moduleRemoteModel;
-	}
-
-	public Object invokeOnRemoteModel(String methodName,
-		Class<?>[] parameterTypes, Object[] parameterValues)
-		throws Exception {
-		Object[] remoteParameterValues = new Object[parameterValues.length];
-
-		for (int i = 0; i < parameterValues.length; i++) {
-			if (parameterValues[i] != null) {
-				remoteParameterValues[i] = ClpSerializer.translateInput(parameterValues[i]);
-			}
-		}
-
-		Class<?> remoteModelClass = _moduleRemoteModel.getClass();
-
-		ClassLoader remoteModelClassLoader = remoteModelClass.getClassLoader();
-
-		Class<?>[] remoteParameterTypes = new Class[parameterTypes.length];
-
-		for (int i = 0; i < parameterTypes.length; i++) {
-			if (parameterTypes[i].isPrimitive()) {
-				remoteParameterTypes[i] = parameterTypes[i];
-			}
-			else {
-				String parameterTypeName = parameterTypes[i].getName();
-
-				remoteParameterTypes[i] = remoteModelClassLoader.loadClass(parameterTypeName);
-			}
-		}
-
-		Method method = remoteModelClass.getMethod(methodName,
-				remoteParameterTypes);
-
-		Object returnValue = method.invoke(_moduleRemoteModel,
-				remoteParameterValues);
-
-		if (returnValue != null) {
-			returnValue = ClpSerializer.translateOutput(returnValue);
-		}
-
-		return returnValue;
-	}
-
-	@Override
-	public void persist() throws SystemException {
-		if (this.isNew()) {
-			ModuleLocalServiceUtil.addModule(this);
-		}
-		else {
-			ModuleLocalServiceUtil.updateModule(this);
-		}
-	}
-
-	@Override
-	public Module toEscapedModel() {
-		return (Module)ProxyUtil.newProxyInstance(Module.class.getClassLoader(),
-			new Class[] { Module.class }, new AutoEscapeBeanHandler(this));
-	}
-
-	@Override
-	public Object clone() {
-		ModuleClp clone = new ModuleClp();
-
-		clone.setUuid(getUuid());
-		clone.setModuleId(getModuleId());
-		clone.setAppId(getAppId());
-		clone.setContextName(getContextName());
-
-		return clone;
-	}
-
-	@Override
-	public int compareTo(Module module) {
-		long primaryKey = module.getPrimaryKey();
-
-		if (getPrimaryKey() < primaryKey) {
-			return -1;
-		}
-		else if (getPrimaryKey() > primaryKey) {
-			return 1;
-		}
-		else {
-			return 0;
-		}
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-
-		if (!(obj instanceof ModuleClp)) {
-			return false;
-		}
-
-		ModuleClp module = (ModuleClp)obj;
-
-		long primaryKey = module.getPrimaryKey();
-
-		if (getPrimaryKey() == primaryKey) {
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-
-	@Override
-	public int hashCode() {
-		return (int)getPrimaryKey();
-	}
-
-	@Override
-	public String toString() {
-		StringBundler sb = new StringBundler(9);
-
-		sb.append("{uuid=");
-		sb.append(getUuid());
-		sb.append(", moduleId=");
-		sb.append(getModuleId());
-		sb.append(", appId=");
-		sb.append(getAppId());
-		sb.append(", contextName=");
-		sb.append(getContextName());
-		sb.append("}");
-
-		return sb.toString();
-	}
-
-	@Override
-	public String toXmlString() {
-		StringBundler sb = new StringBundler(16);
-
-		sb.append("<model><model-name>");
-		sb.append("com.liferay.marketplace.model.Module");
-		sb.append("</model-name>");
-
-		sb.append(
-			"<column><column-name>uuid</column-name><column-value><![CDATA[");
-		sb.append(getUuid());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>moduleId</column-name><column-value><![CDATA[");
-		sb.append(getModuleId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>appId</column-name><column-value><![CDATA[");
-		sb.append(getAppId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>contextName</column-name><column-value><![CDATA[");
-		sb.append(getContextName());
-		sb.append("]]></column-value></column>");
-
-		sb.append("</model>");
-
-		return sb.toString();
-	}
-
-	private String _uuid;
-	private long _moduleId;
-	private long _appId;
-	private String _contextName;
-	private BaseModel<?> _moduleRemoteModel;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleModel.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleModel.java
deleted file mode 100644
index 7fd5931..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleModel.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.portal.kernel.bean.AutoEscape;
-import com.liferay.portal.model.BaseModel;
-import com.liferay.portal.model.CacheModel;
-import com.liferay.portal.service.ServiceContext;
-
-import com.liferay.portlet.expando.model.ExpandoBridge;
-
-import java.io.Serializable;
-
-/**
- * The base model interface for the Module service. Represents a row in the &quot;Marketplace_Module&quot; database table, with each column mapped to a property of this class.
- *
- * <p>
- * This interface and its corresponding implementation {@link com.liferay.marketplace.model.impl.ModuleModelImpl} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link com.liferay.marketplace.model.impl.ModuleImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see Module
- * @see com.liferay.marketplace.model.impl.ModuleImpl
- * @see com.liferay.marketplace.model.impl.ModuleModelImpl
- * @generated
- */
-public interface ModuleModel extends BaseModel<Module> {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. All methods that expect a module model instance should use the {@link Module} interface instead.
-	 */
-
-	/**
-	 * Returns the primary key of this module.
-	 *
-	 * @return the primary key of this module
-	 */
-	public long getPrimaryKey();
-
-	/**
-	 * Sets the primary key of this module.
-	 *
-	 * @param primaryKey the primary key of this module
-	 */
-	public void setPrimaryKey(long primaryKey);
-
-	/**
-	 * Returns the uuid of this module.
-	 *
-	 * @return the uuid of this module
-	 */
-	@AutoEscape
-	public String getUuid();
-
-	/**
-	 * Sets the uuid of this module.
-	 *
-	 * @param uuid the uuid of this module
-	 */
-	public void setUuid(String uuid);
-
-	/**
-	 * Returns the module ID of this module.
-	 *
-	 * @return the module ID of this module
-	 */
-	public long getModuleId();
-
-	/**
-	 * Sets the module ID of this module.
-	 *
-	 * @param moduleId the module ID of this module
-	 */
-	public void setModuleId(long moduleId);
-
-	/**
-	 * Returns the app ID of this module.
-	 *
-	 * @return the app ID of this module
-	 */
-	public long getAppId();
-
-	/**
-	 * Sets the app ID of this module.
-	 *
-	 * @param appId the app ID of this module
-	 */
-	public void setAppId(long appId);
-
-	/**
-	 * Returns the context name of this module.
-	 *
-	 * @return the context name of this module
-	 */
-	@AutoEscape
-	public String getContextName();
-
-	/**
-	 * Sets the context name of this module.
-	 *
-	 * @param contextName the context name of this module
-	 */
-	public void setContextName(String contextName);
-
-	@Override
-	public boolean isNew();
-
-	@Override
-	public void setNew(boolean n);
-
-	@Override
-	public boolean isCachedModel();
-
-	@Override
-	public void setCachedModel(boolean cachedModel);
-
-	@Override
-	public boolean isEscapedModel();
-
-	@Override
-	public Serializable getPrimaryKeyObj();
-
-	@Override
-	public void setPrimaryKeyObj(Serializable primaryKeyObj);
-
-	@Override
-	public ExpandoBridge getExpandoBridge();
-
-	@Override
-	public void setExpandoBridgeAttributes(BaseModel<?> baseModel);
-
-	@Override
-	public void setExpandoBridgeAttributes(ExpandoBridge expandoBridge);
-
-	@Override
-	public void setExpandoBridgeAttributes(ServiceContext serviceContext);
-
-	@Override
-	public Object clone();
-
-	@Override
-	public int compareTo(Module module);
-
-	@Override
-	public int hashCode();
-
-	@Override
-	public CacheModel<Module> toCacheModel();
-
-	@Override
-	public Module toEscapedModel();
-
-	@Override
-	public Module toUnescapedModel();
-
-	@Override
-	public String toString();
-
-	@Override
-	public String toXmlString();
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleSoap.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleSoap.java
deleted file mode 100644
index 3ebfee8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleSoap.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class is used by SOAP remote services.
- *
- * @author Ryan Park
- * @generated
- */
-public class ModuleSoap implements Serializable {
-	public static ModuleSoap toSoapModel(Module model) {
-		ModuleSoap soapModel = new ModuleSoap();
-
-		soapModel.setUuid(model.getUuid());
-		soapModel.setModuleId(model.getModuleId());
-		soapModel.setAppId(model.getAppId());
-		soapModel.setContextName(model.getContextName());
-
-		return soapModel;
-	}
-
-	public static ModuleSoap[] toSoapModels(Module[] models) {
-		ModuleSoap[] soapModels = new ModuleSoap[models.length];
-
-		for (int i = 0; i < models.length; i++) {
-			soapModels[i] = toSoapModel(models[i]);
-		}
-
-		return soapModels;
-	}
-
-	public static ModuleSoap[][] toSoapModels(Module[][] models) {
-		ModuleSoap[][] soapModels = null;
-
-		if (models.length > 0) {
-			soapModels = new ModuleSoap[models.length][models[0].length];
-		}
-		else {
-			soapModels = new ModuleSoap[0][0];
-		}
-
-		for (int i = 0; i < models.length; i++) {
-			soapModels[i] = toSoapModels(models[i]);
-		}
-
-		return soapModels;
-	}
-
-	public static ModuleSoap[] toSoapModels(List<Module> models) {
-		List<ModuleSoap> soapModels = new ArrayList<ModuleSoap>(models.size());
-
-		for (Module model : models) {
-			soapModels.add(toSoapModel(model));
-		}
-
-		return soapModels.toArray(new ModuleSoap[soapModels.size()]);
-	}
-
-	public ModuleSoap() {
-	}
-
-	public long getPrimaryKey() {
-		return _moduleId;
-	}
-
-	public void setPrimaryKey(long pk) {
-		setModuleId(pk);
-	}
-
-	public String getUuid() {
-		return _uuid;
-	}
-
-	public void setUuid(String uuid) {
-		_uuid = uuid;
-	}
-
-	public long getModuleId() {
-		return _moduleId;
-	}
-
-	public void setModuleId(long moduleId) {
-		_moduleId = moduleId;
-	}
-
-	public long getAppId() {
-		return _appId;
-	}
-
-	public void setAppId(long appId) {
-		_appId = appId;
-	}
-
-	public String getContextName() {
-		return _contextName;
-	}
-
-	public void setContextName(String contextName) {
-		_contextName = contextName;
-	}
-
-	private String _uuid;
-	private long _moduleId;
-	private long _appId;
-	private String _contextName;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleWrapper.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleWrapper.java
deleted file mode 100644
index a2325e5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/model/ModuleWrapper.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model;
-
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.model.ModelWrapper;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * <p>
- * This class is a wrapper for {@link Module}.
- * </p>
- *
- * @author Ryan Park
- * @see Module
- * @generated
- */
-public class ModuleWrapper implements Module, ModelWrapper<Module> {
-	public ModuleWrapper(Module module) {
-		_module = module;
-	}
-
-	@Override
-	public Class<?> getModelClass() {
-		return Module.class;
-	}
-
-	@Override
-	public String getModelClassName() {
-		return Module.class.getName();
-	}
-
-	@Override
-	public Map<String, Object> getModelAttributes() {
-		Map<String, Object> attributes = new HashMap<String, Object>();
-
-		attributes.put("uuid", getUuid());
-		attributes.put("moduleId", getModuleId());
-		attributes.put("appId", getAppId());
-		attributes.put("contextName", getContextName());
-
-		return attributes;
-	}
-
-	@Override
-	public void setModelAttributes(Map<String, Object> attributes) {
-		String uuid = (String)attributes.get("uuid");
-
-		if (uuid != null) {
-			setUuid(uuid);
-		}
-
-		Long moduleId = (Long)attributes.get("moduleId");
-
-		if (moduleId != null) {
-			setModuleId(moduleId);
-		}
-
-		Long appId = (Long)attributes.get("appId");
-
-		if (appId != null) {
-			setAppId(appId);
-		}
-
-		String contextName = (String)attributes.get("contextName");
-
-		if (contextName != null) {
-			setContextName(contextName);
-		}
-	}
-
-	/**
-	* Returns the primary key of this module.
-	*
-	* @return the primary key of this module
-	*/
-	@Override
-	public long getPrimaryKey() {
-		return _module.getPrimaryKey();
-	}
-
-	/**
-	* Sets the primary key of this module.
-	*
-	* @param primaryKey the primary key of this module
-	*/
-	@Override
-	public void setPrimaryKey(long primaryKey) {
-		_module.setPrimaryKey(primaryKey);
-	}
-
-	/**
-	* Returns the uuid of this module.
-	*
-	* @return the uuid of this module
-	*/
-	@Override
-	public java.lang.String getUuid() {
-		return _module.getUuid();
-	}
-
-	/**
-	* Sets the uuid of this module.
-	*
-	* @param uuid the uuid of this module
-	*/
-	@Override
-	public void setUuid(java.lang.String uuid) {
-		_module.setUuid(uuid);
-	}
-
-	/**
-	* Returns the module ID of this module.
-	*
-	* @return the module ID of this module
-	*/
-	@Override
-	public long getModuleId() {
-		return _module.getModuleId();
-	}
-
-	/**
-	* Sets the module ID of this module.
-	*
-	* @param moduleId the module ID of this module
-	*/
-	@Override
-	public void setModuleId(long moduleId) {
-		_module.setModuleId(moduleId);
-	}
-
-	/**
-	* Returns the app ID of this module.
-	*
-	* @return the app ID of this module
-	*/
-	@Override
-	public long getAppId() {
-		return _module.getAppId();
-	}
-
-	/**
-	* Sets the app ID of this module.
-	*
-	* @param appId the app ID of this module
-	*/
-	@Override
-	public void setAppId(long appId) {
-		_module.setAppId(appId);
-	}
-
-	/**
-	* Returns the context name of this module.
-	*
-	* @return the context name of this module
-	*/
-	@Override
-	public java.lang.String getContextName() {
-		return _module.getContextName();
-	}
-
-	/**
-	* Sets the context name of this module.
-	*
-	* @param contextName the context name of this module
-	*/
-	@Override
-	public void setContextName(java.lang.String contextName) {
-		_module.setContextName(contextName);
-	}
-
-	@Override
-	public boolean isNew() {
-		return _module.isNew();
-	}
-
-	@Override
-	public void setNew(boolean n) {
-		_module.setNew(n);
-	}
-
-	@Override
-	public boolean isCachedModel() {
-		return _module.isCachedModel();
-	}
-
-	@Override
-	public void setCachedModel(boolean cachedModel) {
-		_module.setCachedModel(cachedModel);
-	}
-
-	@Override
-	public boolean isEscapedModel() {
-		return _module.isEscapedModel();
-	}
-
-	@Override
-	public java.io.Serializable getPrimaryKeyObj() {
-		return _module.getPrimaryKeyObj();
-	}
-
-	@Override
-	public void setPrimaryKeyObj(java.io.Serializable primaryKeyObj) {
-		_module.setPrimaryKeyObj(primaryKeyObj);
-	}
-
-	@Override
-	public com.liferay.portlet.expando.model.ExpandoBridge getExpandoBridge() {
-		return _module.getExpandoBridge();
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(
-		com.liferay.portal.model.BaseModel<?> baseModel) {
-		_module.setExpandoBridgeAttributes(baseModel);
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(
-		com.liferay.portlet.expando.model.ExpandoBridge expandoBridge) {
-		_module.setExpandoBridgeAttributes(expandoBridge);
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(
-		com.liferay.portal.service.ServiceContext serviceContext) {
-		_module.setExpandoBridgeAttributes(serviceContext);
-	}
-
-	@Override
-	public java.lang.Object clone() {
-		return new ModuleWrapper((Module)_module.clone());
-	}
-
-	@Override
-	public int compareTo(com.liferay.marketplace.model.Module module) {
-		return _module.compareTo(module);
-	}
-
-	@Override
-	public int hashCode() {
-		return _module.hashCode();
-	}
-
-	@Override
-	public com.liferay.portal.model.CacheModel<com.liferay.marketplace.model.Module> toCacheModel() {
-		return _module.toCacheModel();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module toEscapedModel() {
-		return new ModuleWrapper(_module.toEscapedModel());
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module toUnescapedModel() {
-		return new ModuleWrapper(_module.toUnescapedModel());
-	}
-
-	@Override
-	public java.lang.String toString() {
-		return _module.toString();
-	}
-
-	@Override
-	public java.lang.String toXmlString() {
-		return _module.toXmlString();
-	}
-
-	@Override
-	public void persist()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		_module.persist();
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-
-		if (!(obj instanceof ModuleWrapper)) {
-			return false;
-		}
-
-		ModuleWrapper moduleWrapper = (ModuleWrapper)obj;
-
-		if (Validator.equals(_module, moduleWrapper._module)) {
-			return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #getWrappedModel}
-	 */
-	public Module getWrappedModule() {
-		return _module;
-	}
-
-	@Override
-	public Module getWrappedModel() {
-		return _module;
-	}
-
-	@Override
-	public void resetOriginalValues() {
-		_module.resetOriginalValues();
-	}
-
-	private Module _module;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalService.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalService.java
deleted file mode 100644
index c9c1196..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalService.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.transaction.Isolation;
-import com.liferay.portal.kernel.transaction.Propagation;
-import com.liferay.portal.kernel.transaction.Transactional;
-import com.liferay.portal.service.BaseLocalService;
-import com.liferay.portal.service.InvokableLocalService;
-import com.liferay.portal.service.PersistedModelLocalService;
-
-/**
- * Provides the local service interface for App. Methods of this
- * service will not have security checks based on the propagated JAAS
- * credentials because this service can only be accessed from within the same
- * VM.
- *
- * @author Ryan Park
- * @see AppLocalServiceUtil
- * @see com.liferay.marketplace.service.base.AppLocalServiceBaseImpl
- * @see com.liferay.marketplace.service.impl.AppLocalServiceImpl
- * @generated
- */
-@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
-	PortalException.class, SystemException.class})
-public interface AppLocalService extends BaseLocalService, InvokableLocalService,
-	PersistedModelLocalService {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. Always use {@link AppLocalServiceUtil} to access the app local service. Add custom service methods to {@link com.liferay.marketplace.service.impl.AppLocalServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
-	 */
-
-	/**
-	* Adds the app to the database. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was added
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App addApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Creates a new app with the primary key. Does not add the app to the database.
-	*
-	* @param appId the primary key for the new app
-	* @return the new app
-	*/
-	public com.liferay.marketplace.model.App createApp(long appId);
-
-	/**
-	* Deletes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param appId the primary key of the app
-	* @return the app that was removed
-	* @throws PortalException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Deletes the app from the database. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App deleteApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery();
-
-	/**
-	* Performs a dynamic query on the database and returns the matching rows.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Performs a dynamic query on the database and returns a range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @return the range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @param projection the projection to apply to the query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.App fetchApp(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app with the matching UUID and company.
-	*
-	* @param uuid the app's UUID
-	* @param companyId the primary key of the company
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.App fetchAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app with the primary key.
-	*
-	* @param appId the primary key of the app
-	* @return the app
-	* @throws PortalException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.App getApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	@Override
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app with the matching UUID and company.
-	*
-	* @param uuid the app's UUID
-	* @param companyId the primary key of the company
-	* @return the matching app
-	* @throws PortalException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.App getAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public java.util.List<com.liferay.marketplace.model.App> getApps(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps.
-	*
-	* @return the number of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public int getAppsCount()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Updates the app in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was updated
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App updateApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	public java.lang.String getBeanIdentifier();
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	public void setBeanIdentifier(java.lang.String beanIdentifier);
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable;
-
-	public void clearInstalledAppsCache();
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.App fetchRemoteApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public java.util.List<com.liferay.marketplace.model.App> getApps(
-		java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public java.util.Map<java.lang.String, java.lang.String> getBundledApps();
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public java.util.List<com.liferay.marketplace.model.App> getInstalledApps()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	public void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public void processMarketplaceProperties(java.util.Properties properties)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String title, java.lang.String description,
-		java.lang.String category, java.lang.String iconURL,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceClp.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceClp.java
deleted file mode 100644
index e0211e6..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceClp.java
+++ /dev/null
@@ -1,1156 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.service.InvokableLocalService;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class AppLocalServiceClp implements AppLocalService {
-	public AppLocalServiceClp(InvokableLocalService invokableLocalService) {
-		_invokableLocalService = invokableLocalService;
-
-		_methodName0 = "addApp";
-
-		_methodParameterTypes0 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName1 = "createApp";
-
-		_methodParameterTypes1 = new String[] { "long" };
-
-		_methodName2 = "deleteApp";
-
-		_methodParameterTypes2 = new String[] { "long" };
-
-		_methodName3 = "deleteApp";
-
-		_methodParameterTypes3 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName4 = "dynamicQuery";
-
-		_methodParameterTypes4 = new String[] {  };
-
-		_methodName5 = "dynamicQuery";
-
-		_methodParameterTypes5 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName6 = "dynamicQuery";
-
-		_methodParameterTypes6 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int"
-			};
-
-		_methodName7 = "dynamicQuery";
-
-		_methodParameterTypes7 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int",
-				"com.liferay.portal.kernel.util.OrderByComparator"
-			};
-
-		_methodName8 = "dynamicQueryCount";
-
-		_methodParameterTypes8 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName9 = "dynamicQueryCount";
-
-		_methodParameterTypes9 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery",
-				"com.liferay.portal.kernel.dao.orm.Projection"
-			};
-
-		_methodName10 = "fetchApp";
-
-		_methodParameterTypes10 = new String[] { "long" };
-
-		_methodName11 = "fetchAppByUuidAndCompanyId";
-
-		_methodParameterTypes11 = new String[] { "java.lang.String", "long" };
-
-		_methodName12 = "getApp";
-
-		_methodParameterTypes12 = new String[] { "long" };
-
-		_methodName13 = "getPersistedModel";
-
-		_methodParameterTypes13 = new String[] { "java.io.Serializable" };
-
-		_methodName14 = "getAppByUuidAndCompanyId";
-
-		_methodParameterTypes14 = new String[] { "java.lang.String", "long" };
-
-		_methodName15 = "getApps";
-
-		_methodParameterTypes15 = new String[] { "int", "int" };
-
-		_methodName16 = "getAppsCount";
-
-		_methodParameterTypes16 = new String[] {  };
-
-		_methodName17 = "updateApp";
-
-		_methodParameterTypes17 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName18 = "getBeanIdentifier";
-
-		_methodParameterTypes18 = new String[] {  };
-
-		_methodName19 = "setBeanIdentifier";
-
-		_methodParameterTypes19 = new String[] { "java.lang.String" };
-
-		_methodName21 = "clearInstalledAppsCache";
-
-		_methodParameterTypes21 = new String[] {  };
-
-		_methodName22 = "fetchRemoteApp";
-
-		_methodParameterTypes22 = new String[] { "long" };
-
-		_methodName23 = "getApps";
-
-		_methodParameterTypes23 = new String[] { "java.lang.String" };
-
-		_methodName24 = "getBundledApps";
-
-		_methodParameterTypes24 = new String[] {  };
-
-		_methodName25 = "getInstalledApps";
-
-		_methodParameterTypes25 = new String[] {  };
-
-		_methodName26 = "installApp";
-
-		_methodParameterTypes26 = new String[] { "long" };
-
-		_methodName27 = "processMarketplaceProperties";
-
-		_methodParameterTypes27 = new String[] { "java.util.Properties" };
-
-		_methodName28 = "uninstallApp";
-
-		_methodParameterTypes28 = new String[] { "long" };
-
-		_methodName29 = "updateApp";
-
-		_methodParameterTypes29 = new String[] {
-				"long", "long", "java.lang.String", "java.io.File"
-			};
-
-		_methodName30 = "updateApp";
-
-		_methodParameterTypes30 = new String[] {
-				"long", "long", "java.lang.String", "java.lang.String",
-				"java.lang.String", "java.lang.String", "java.lang.String",
-				"java.io.File"
-			};
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App addApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName0,
-					_methodParameterTypes0,
-					new Object[] { ClpSerializer.translateInput(app) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App createApp(long appId) {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName1,
-					_methodParameterTypes1, new Object[] { appId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName2,
-					_methodParameterTypes2, new Object[] { appId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App deleteApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName3,
-					_methodParameterTypes3,
-					new Object[] { ClpSerializer.translateInput(app) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName4,
-					_methodParameterTypes4, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.portal.kernel.dao.orm.DynamicQuery)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName5,
-					_methodParameterTypes5,
-					new Object[] { ClpSerializer.translateInput(dynamicQuery) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName6,
-					_methodParameterTypes6,
-					new Object[] {
-						ClpSerializer.translateInput(dynamicQuery),
-						
-					start,
-						
-					end
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName7,
-					_methodParameterTypes7,
-					new Object[] {
-						ClpSerializer.translateInput(dynamicQuery),
-						
-					start,
-						
-					end,
-						
-					ClpSerializer.translateInput(orderByComparator)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName8,
-					_methodParameterTypes8,
-					new Object[] { ClpSerializer.translateInput(dynamicQuery) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return ((Long)returnObj).longValue();
-	}
-
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName9,
-					_methodParameterTypes9,
-					new Object[] {
-						ClpSerializer.translateInput(dynamicQuery),
-						
-					ClpSerializer.translateInput(projection)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return ((Long)returnObj).longValue();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App fetchApp(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName10,
-					_methodParameterTypes10, new Object[] { appId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App fetchAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName11,
-					_methodParameterTypes11,
-					new Object[] { ClpSerializer.translateInput(uuid), companyId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App getApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName12,
-					_methodParameterTypes12, new Object[] { appId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName13,
-					_methodParameterTypes13,
-					new Object[] { ClpSerializer.translateInput(primaryKeyObj) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.portal.model.PersistedModel)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App getAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName14,
-					_methodParameterTypes14,
-					new Object[] { ClpSerializer.translateInput(uuid), companyId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.App> getApps(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName15,
-					_methodParameterTypes15, new Object[] { start, end });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List<com.liferay.marketplace.model.App>)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public int getAppsCount()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName16,
-					_methodParameterTypes16, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return ((Integer)returnObj).intValue();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName17,
-					_methodParameterTypes17,
-					new Object[] { ClpSerializer.translateInput(app) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.lang.String getBeanIdentifier() {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName18,
-					_methodParameterTypes18, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.lang.String)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public void setBeanIdentifier(java.lang.String beanIdentifier) {
-		try {
-			_invokableLocalService.invokeMethod(_methodName19,
-				_methodParameterTypes19,
-				new Object[] { ClpSerializer.translateInput(beanIdentifier) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public void clearInstalledAppsCache() {
-		try {
-			_invokableLocalService.invokeMethod(_methodName21,
-				_methodParameterTypes21, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App fetchRemoteApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName22,
-					_methodParameterTypes22, new Object[] { remoteAppId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.App> getApps(
-		java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName23,
-					_methodParameterTypes23,
-					new Object[] { ClpSerializer.translateInput(category) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List<com.liferay.marketplace.model.App>)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.util.Map<java.lang.String, java.lang.String> getBundledApps() {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName24,
-					_methodParameterTypes24, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.Map<java.lang.String, java.lang.String>)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.App> getInstalledApps()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName25,
-					_methodParameterTypes25, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List<com.liferay.marketplace.model.App>)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		try {
-			_invokableLocalService.invokeMethod(_methodName26,
-				_methodParameterTypes26, new Object[] { remoteAppId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public void processMarketplaceProperties(java.util.Properties properties)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		try {
-			_invokableLocalService.invokeMethod(_methodName27,
-				_methodParameterTypes27,
-				new Object[] { ClpSerializer.translateInput(properties) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		try {
-			_invokableLocalService.invokeMethod(_methodName28,
-				_methodParameterTypes28, new Object[] { remoteAppId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName29,
-					_methodParameterTypes29,
-					new Object[] {
-						userId,
-						
-					remoteAppId,
-						
-					ClpSerializer.translateInput(version),
-						
-					ClpSerializer.translateInput(file)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String title, java.lang.String description,
-		java.lang.String category, java.lang.String iconURL,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName30,
-					_methodParameterTypes30,
-					new Object[] {
-						userId,
-						
-					remoteAppId,
-						
-					ClpSerializer.translateInput(title),
-						
-					ClpSerializer.translateInput(description),
-						
-					ClpSerializer.translateInput(category),
-						
-					ClpSerializer.translateInput(iconURL),
-						
-					ClpSerializer.translateInput(version),
-						
-					ClpSerializer.translateInput(file)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	private InvokableLocalService _invokableLocalService;
-	private String _methodName0;
-	private String[] _methodParameterTypes0;
-	private String _methodName1;
-	private String[] _methodParameterTypes1;
-	private String _methodName2;
-	private String[] _methodParameterTypes2;
-	private String _methodName3;
-	private String[] _methodParameterTypes3;
-	private String _methodName4;
-	private String[] _methodParameterTypes4;
-	private String _methodName5;
-	private String[] _methodParameterTypes5;
-	private String _methodName6;
-	private String[] _methodParameterTypes6;
-	private String _methodName7;
-	private String[] _methodParameterTypes7;
-	private String _methodName8;
-	private String[] _methodParameterTypes8;
-	private String _methodName9;
-	private String[] _methodParameterTypes9;
-	private String _methodName10;
-	private String[] _methodParameterTypes10;
-	private String _methodName11;
-	private String[] _methodParameterTypes11;
-	private String _methodName12;
-	private String[] _methodParameterTypes12;
-	private String _methodName13;
-	private String[] _methodParameterTypes13;
-	private String _methodName14;
-	private String[] _methodParameterTypes14;
-	private String _methodName15;
-	private String[] _methodParameterTypes15;
-	private String _methodName16;
-	private String[] _methodParameterTypes16;
-	private String _methodName17;
-	private String[] _methodParameterTypes17;
-	private String _methodName18;
-	private String[] _methodParameterTypes18;
-	private String _methodName19;
-	private String[] _methodParameterTypes19;
-	private String _methodName21;
-	private String[] _methodParameterTypes21;
-	private String _methodName22;
-	private String[] _methodParameterTypes22;
-	private String _methodName23;
-	private String[] _methodParameterTypes23;
-	private String _methodName24;
-	private String[] _methodParameterTypes24;
-	private String _methodName25;
-	private String[] _methodParameterTypes25;
-	private String _methodName26;
-	private String[] _methodParameterTypes26;
-	private String _methodName27;
-	private String[] _methodParameterTypes27;
-	private String _methodName28;
-	private String[] _methodParameterTypes28;
-	private String _methodName29;
-	private String[] _methodParameterTypes29;
-	private String _methodName30;
-	private String[] _methodParameterTypes30;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceUtil.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceUtil.java
deleted file mode 100644
index bf4d83e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceUtil.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
-import com.liferay.portal.kernel.util.ReferenceRegistry;
-import com.liferay.portal.service.InvokableLocalService;
-
-/**
- * Provides the local service utility for App. This utility wraps
- * {@link com.liferay.marketplace.service.impl.AppLocalServiceImpl} and is the
- * primary access point for service operations in application layer code running
- * on the local server. Methods of this service will not have security checks
- * based on the propagated JAAS credentials because this service can only be
- * accessed from within the same VM.
- *
- * @author Ryan Park
- * @see AppLocalService
- * @see com.liferay.marketplace.service.base.AppLocalServiceBaseImpl
- * @see com.liferay.marketplace.service.impl.AppLocalServiceImpl
- * @generated
- */
-public class AppLocalServiceUtil {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this class directly. Add custom service methods to {@link com.liferay.marketplace.service.impl.AppLocalServiceImpl} and rerun ServiceBuilder to regenerate this class.
-	 */
-
-	/**
-	* Adds the app to the database. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was added
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App addApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().addApp(app);
-	}
-
-	/**
-	* Creates a new app with the primary key. Does not add the app to the database.
-	*
-	* @param appId the primary key for the new app
-	* @return the new app
-	*/
-	public static com.liferay.marketplace.model.App createApp(long appId) {
-		return getService().createApp(appId);
-	}
-
-	/**
-	* Deletes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param appId the primary key of the app
-	* @return the app that was removed
-	* @throws PortalException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().deleteApp(appId);
-	}
-
-	/**
-	* Deletes the app from the database. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App deleteApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().deleteApp(app);
-	}
-
-	public static com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
-		return getService().dynamicQuery();
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns the matching rows.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public static java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQuery(dynamicQuery);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns a range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @return the range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public static java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public static java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService()
-				   .dynamicQuery(dynamicQuery, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public static long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQueryCount(dynamicQuery);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @param projection the projection to apply to the query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public static long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQueryCount(dynamicQuery, projection);
-	}
-
-	public static com.liferay.marketplace.model.App fetchApp(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().fetchApp(appId);
-	}
-
-	/**
-	* Returns the app with the matching UUID and company.
-	*
-	* @param uuid the app's UUID
-	* @param companyId the primary key of the company
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().fetchAppByUuidAndCompanyId(uuid, companyId);
-	}
-
-	/**
-	* Returns the app with the primary key.
-	*
-	* @param appId the primary key of the app
-	* @return the app
-	* @throws PortalException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App getApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().getApp(appId);
-	}
-
-	public static com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().getPersistedModel(primaryKeyObj);
-	}
-
-	/**
-	* Returns the app with the matching UUID and company.
-	*
-	* @param uuid the app's UUID
-	* @param companyId the primary key of the company
-	* @return the matching app
-	* @throws PortalException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App getAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().getAppByUuidAndCompanyId(uuid, companyId);
-	}
-
-	/**
-	* Returns a range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> getApps(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getApps(start, end);
-	}
-
-	/**
-	* Returns the number of apps.
-	*
-	* @return the number of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int getAppsCount()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getAppsCount();
-	}
-
-	/**
-	* Updates the app in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was updated
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App updateApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().updateApp(app);
-	}
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	public static java.lang.String getBeanIdentifier() {
-		return getService().getBeanIdentifier();
-	}
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	public static void setBeanIdentifier(java.lang.String beanIdentifier) {
-		getService().setBeanIdentifier(beanIdentifier);
-	}
-
-	public static java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		return getService().invokeMethod(name, parameterTypes, arguments);
-	}
-
-	public static void clearInstalledAppsCache() {
-		getService().clearInstalledAppsCache();
-	}
-
-	public static com.liferay.marketplace.model.App fetchRemoteApp(
-		long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().fetchRemoteApp(remoteAppId);
-	}
-
-	public static java.util.List<com.liferay.marketplace.model.App> getApps(
-		java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getApps(category);
-	}
-
-	public static java.util.Map<java.lang.String, java.lang.String> getBundledApps() {
-		return getService().getBundledApps();
-	}
-
-	public static java.util.List<com.liferay.marketplace.model.App> getInstalledApps()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getInstalledApps();
-	}
-
-	public static void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		getService().installApp(remoteAppId);
-	}
-
-	public static void processMarketplaceProperties(
-		java.util.Properties properties)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		getService().processMarketplaceProperties(properties);
-	}
-
-	public static void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		getService().uninstallApp(remoteAppId);
-	}
-
-	public static com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().updateApp(userId, remoteAppId, version, file);
-	}
-
-	public static com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String title, java.lang.String description,
-		java.lang.String category, java.lang.String iconURL,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService()
-				   .updateApp(userId, remoteAppId, title, description,
-			category, iconURL, version, file);
-	}
-
-	public static void clearService() {
-		_service = null;
-	}
-
-	public static AppLocalService getService() {
-		if (_service == null) {
-			InvokableLocalService invokableLocalService = (InvokableLocalService)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),
-					AppLocalService.class.getName());
-
-			if (invokableLocalService instanceof AppLocalService) {
-				_service = (AppLocalService)invokableLocalService;
-			}
-			else {
-				_service = new AppLocalServiceClp(invokableLocalService);
-			}
-
-			ReferenceRegistry.registerReference(AppLocalServiceUtil.class,
-				"_service");
-		}
-
-		return _service;
-	}
-
-	/**
-	 * @deprecated As of 6.2.0
-	 */
-	public void setService(AppLocalService service) {
-	}
-
-	private static AppLocalService _service;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceWrapper.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceWrapper.java
deleted file mode 100644
index 9a74c1a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppLocalServiceWrapper.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.service.ServiceWrapper;
-
-/**
- * Provides a wrapper for {@link AppLocalService}.
- *
- * @author Ryan Park
- * @see AppLocalService
- * @generated
- */
-public class AppLocalServiceWrapper implements AppLocalService,
-	ServiceWrapper<AppLocalService> {
-	public AppLocalServiceWrapper(AppLocalService appLocalService) {
-		_appLocalService = appLocalService;
-	}
-
-	/**
-	* Adds the app to the database. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was added
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App addApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.addApp(app);
-	}
-
-	/**
-	* Creates a new app with the primary key. Does not add the app to the database.
-	*
-	* @param appId the primary key for the new app
-	* @return the new app
-	*/
-	@Override
-	public com.liferay.marketplace.model.App createApp(long appId) {
-		return _appLocalService.createApp(appId);
-	}
-
-	/**
-	* Deletes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param appId the primary key of the app
-	* @return the app that was removed
-	* @throws PortalException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.deleteApp(appId);
-	}
-
-	/**
-	* Deletes the app from the database. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App deleteApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.deleteApp(app);
-	}
-
-	@Override
-	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
-		return _appLocalService.dynamicQuery();
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns the matching rows.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.dynamicQuery(dynamicQuery);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns a range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @return the range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.dynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.dynamicQuery(dynamicQuery, start, end,
-			orderByComparator);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.dynamicQueryCount(dynamicQuery);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @param projection the projection to apply to the query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.dynamicQueryCount(dynamicQuery, projection);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App fetchApp(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.fetchApp(appId);
-	}
-
-	/**
-	* Returns the app with the matching UUID and company.
-	*
-	* @param uuid the app's UUID
-	* @param companyId the primary key of the company
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App fetchAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.fetchAppByUuidAndCompanyId(uuid, companyId);
-	}
-
-	/**
-	* Returns the app with the primary key.
-	*
-	* @param appId the primary key of the app
-	* @return the app
-	* @throws PortalException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App getApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getApp(appId);
-	}
-
-	@Override
-	public com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getPersistedModel(primaryKeyObj);
-	}
-
-	/**
-	* Returns the app with the matching UUID and company.
-	*
-	* @param uuid the app's UUID
-	* @param companyId the primary key of the company
-	* @return the matching app
-	* @throws PortalException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App getAppByUuidAndCompanyId(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getAppByUuidAndCompanyId(uuid, companyId);
-	}
-
-	/**
-	* Returns a range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public java.util.List<com.liferay.marketplace.model.App> getApps(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getApps(start, end);
-	}
-
-	/**
-	* Returns the number of apps.
-	*
-	* @return the number of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public int getAppsCount()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getAppsCount();
-	}
-
-	/**
-	* Updates the app in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	*
-	* @param app the app
-	* @return the app that was updated
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.App updateApp(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.updateApp(app);
-	}
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	@Override
-	public java.lang.String getBeanIdentifier() {
-		return _appLocalService.getBeanIdentifier();
-	}
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	@Override
-	public void setBeanIdentifier(java.lang.String beanIdentifier) {
-		_appLocalService.setBeanIdentifier(beanIdentifier);
-	}
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		return _appLocalService.invokeMethod(name, parameterTypes, arguments);
-	}
-
-	@Override
-	public void clearInstalledAppsCache() {
-		_appLocalService.clearInstalledAppsCache();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App fetchRemoteApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.fetchRemoteApp(remoteAppId);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.App> getApps(
-		java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getApps(category);
-	}
-
-	@Override
-	public java.util.Map<java.lang.String, java.lang.String> getBundledApps() {
-		return _appLocalService.getBundledApps();
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.App> getInstalledApps()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.getInstalledApps();
-	}
-
-	@Override
-	public void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		_appLocalService.installApp(remoteAppId);
-	}
-
-	@Override
-	public void processMarketplaceProperties(java.util.Properties properties)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		_appLocalService.processMarketplaceProperties(properties);
-	}
-
-	@Override
-	public void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		_appLocalService.uninstallApp(remoteAppId);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.updateApp(userId, remoteAppId, version, file);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(long userId,
-		long remoteAppId, java.lang.String title, java.lang.String description,
-		java.lang.String category, java.lang.String iconURL,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appLocalService.updateApp(userId, remoteAppId, title,
-			description, category, iconURL, version, file);
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #getWrappedService}
-	 */
-	public AppLocalService getWrappedAppLocalService() {
-		return _appLocalService;
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #setWrappedService}
-	 */
-	public void setWrappedAppLocalService(AppLocalService appLocalService) {
-		_appLocalService = appLocalService;
-	}
-
-	@Override
-	public AppLocalService getWrappedService() {
-		return _appLocalService;
-	}
-
-	@Override
-	public void setWrappedService(AppLocalService appLocalService) {
-		_appLocalService = appLocalService;
-	}
-
-	private AppLocalService _appLocalService;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppService.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppService.java
deleted file mode 100644
index 8413ed0..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.jsonwebservice.JSONWebService;
-import com.liferay.portal.kernel.transaction.Isolation;
-import com.liferay.portal.kernel.transaction.Transactional;
-import com.liferay.portal.security.ac.AccessControlled;
-import com.liferay.portal.service.BaseService;
-import com.liferay.portal.service.InvokableService;
-
-/**
- * Provides the remote service interface for App. Methods of this
- * service are expected to have security checks based on the propagated JAAS
- * credentials because this service can be accessed remotely.
- *
- * @author Ryan Park
- * @see AppServiceUtil
- * @see com.liferay.marketplace.service.base.AppServiceBaseImpl
- * @see com.liferay.marketplace.service.impl.AppServiceImpl
- * @generated
- */
-@AccessControlled
-@JSONWebService
-@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
-	PortalException.class, SystemException.class})
-public interface AppService extends BaseService, InvokableService {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. Always use {@link AppServiceUtil} to access the app remote service. Add custom service methods to {@link com.liferay.marketplace.service.impl.AppServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
-	 */
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	public java.lang.String getBeanIdentifier();
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	public void setBeanIdentifier(java.lang.String beanIdentifier);
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable;
-
-	public com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.marketplace.model.App updateApp(long remoteAppId,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceClp.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceClp.java
deleted file mode 100644
index 4f8e86f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceClp.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.service.InvokableService;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class AppServiceClp implements AppService {
-	public AppServiceClp(InvokableService invokableService) {
-		_invokableService = invokableService;
-
-		_methodName0 = "getBeanIdentifier";
-
-		_methodParameterTypes0 = new String[] {  };
-
-		_methodName1 = "setBeanIdentifier";
-
-		_methodParameterTypes1 = new String[] { "java.lang.String" };
-
-		_methodName3 = "deleteApp";
-
-		_methodParameterTypes3 = new String[] { "long" };
-
-		_methodName4 = "installApp";
-
-		_methodParameterTypes4 = new String[] { "long" };
-
-		_methodName5 = "uninstallApp";
-
-		_methodParameterTypes5 = new String[] { "long" };
-
-		_methodName6 = "updateApp";
-
-		_methodParameterTypes6 = new String[] {
-				"long", "java.lang.String", "java.io.File"
-			};
-	}
-
-	@Override
-	public java.lang.String getBeanIdentifier() {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableService.invokeMethod(_methodName0,
-					_methodParameterTypes0, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.lang.String)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public void setBeanIdentifier(java.lang.String beanIdentifier) {
-		try {
-			_invokableService.invokeMethod(_methodName1,
-				_methodParameterTypes1,
-				new Object[] { ClpSerializer.translateInput(beanIdentifier) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableService.invokeMethod(_methodName3,
-					_methodParameterTypes3, new Object[] { appId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		try {
-			_invokableService.invokeMethod(_methodName4,
-				_methodParameterTypes4, new Object[] { remoteAppId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		try {
-			_invokableService.invokeMethod(_methodName5,
-				_methodParameterTypes5, new Object[] { remoteAppId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(long remoteAppId,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableService.invokeMethod(_methodName6,
-					_methodParameterTypes6,
-					new Object[] {
-						remoteAppId,
-						
-					ClpSerializer.translateInput(version),
-						
-					ClpSerializer.translateInput(file)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.App)ClpSerializer.translateOutput(returnObj);
-	}
-
-	private InvokableService _invokableService;
-	private String _methodName0;
-	private String[] _methodParameterTypes0;
-	private String _methodName1;
-	private String[] _methodParameterTypes1;
-	private String _methodName3;
-	private String[] _methodParameterTypes3;
-	private String _methodName4;
-	private String[] _methodParameterTypes4;
-	private String _methodName5;
-	private String[] _methodParameterTypes5;
-	private String _methodName6;
-	private String[] _methodParameterTypes6;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceUtil.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceUtil.java
deleted file mode 100644
index fac3fb9..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceUtil.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
-import com.liferay.portal.kernel.util.ReferenceRegistry;
-import com.liferay.portal.service.InvokableService;
-
-/**
- * Provides the remote service utility for App. This utility wraps
- * {@link com.liferay.marketplace.service.impl.AppServiceImpl} and is the
- * primary access point for service operations in application layer code running
- * on a remote server. Methods of this service are expected to have security
- * checks based on the propagated JAAS credentials because this service can be
- * accessed remotely.
- *
- * @author Ryan Park
- * @see AppService
- * @see com.liferay.marketplace.service.base.AppServiceBaseImpl
- * @see com.liferay.marketplace.service.impl.AppServiceImpl
- * @generated
- */
-public class AppServiceUtil {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this class directly. Add custom service methods to {@link com.liferay.marketplace.service.impl.AppServiceImpl} and rerun ServiceBuilder to regenerate this class.
-	 */
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	public static java.lang.String getBeanIdentifier() {
-		return getService().getBeanIdentifier();
-	}
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	public static void setBeanIdentifier(java.lang.String beanIdentifier) {
-		getService().setBeanIdentifier(beanIdentifier);
-	}
-
-	public static java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		return getService().invokeMethod(name, parameterTypes, arguments);
-	}
-
-	public static com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().deleteApp(appId);
-	}
-
-	public static void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		getService().installApp(remoteAppId);
-	}
-
-	public static void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		getService().uninstallApp(remoteAppId);
-	}
-
-	public static com.liferay.marketplace.model.App updateApp(
-		long remoteAppId, java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().updateApp(remoteAppId, version, file);
-	}
-
-	public static void clearService() {
-		_service = null;
-	}
-
-	public static AppService getService() {
-		if (_service == null) {
-			InvokableService invokableService = (InvokableService)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),
-					AppService.class.getName());
-
-			if (invokableService instanceof AppService) {
-				_service = (AppService)invokableService;
-			}
-			else {
-				_service = new AppServiceClp(invokableService);
-			}
-
-			ReferenceRegistry.registerReference(AppServiceUtil.class, "_service");
-		}
-
-		return _service;
-	}
-
-	/**
-	 * @deprecated As of 6.2.0
-	 */
-	public void setService(AppService service) {
-	}
-
-	private static AppService _service;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceWrapper.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceWrapper.java
deleted file mode 100644
index 88eaf24..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/AppServiceWrapper.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.service.ServiceWrapper;
-
-/**
- * Provides a wrapper for {@link AppService}.
- *
- * @author Ryan Park
- * @see AppService
- * @generated
- */
-public class AppServiceWrapper implements AppService,
-	ServiceWrapper<AppService> {
-	public AppServiceWrapper(AppService appService) {
-		_appService = appService;
-	}
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	@Override
-	public java.lang.String getBeanIdentifier() {
-		return _appService.getBeanIdentifier();
-	}
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	@Override
-	public void setBeanIdentifier(java.lang.String beanIdentifier) {
-		_appService.setBeanIdentifier(beanIdentifier);
-	}
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		return _appService.invokeMethod(name, parameterTypes, arguments);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App deleteApp(long appId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appService.deleteApp(appId);
-	}
-
-	@Override
-	public void installApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		_appService.installApp(remoteAppId);
-	}
-
-	@Override
-	public void uninstallApp(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		_appService.uninstallApp(remoteAppId);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.App updateApp(long remoteAppId,
-		java.lang.String version, java.io.File file)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _appService.updateApp(remoteAppId, version, file);
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #getWrappedService}
-	 */
-	public AppService getWrappedAppService() {
-		return _appService;
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #setWrappedService}
-	 */
-	public void setWrappedAppService(AppService appService) {
-		_appService = appService;
-	}
-
-	@Override
-	public AppService getWrappedService() {
-		return _appService;
-	}
-
-	@Override
-	public void setWrappedService(AppService appService) {
-		_appService = appService;
-	}
-
-	private AppService _appService;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ClpSerializer.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ClpSerializer.java
deleted file mode 100644
index 03297af..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ClpSerializer.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.marketplace.model.AppClp;
-import com.liferay.marketplace.model.ModuleClp;
-
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
-import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
-import com.liferay.portal.kernel.log.Log;
-import com.liferay.portal.kernel.log.LogFactoryUtil;
-import com.liferay.portal.kernel.util.ClassLoaderObjectInputStream;
-import com.liferay.portal.kernel.util.PropsUtil;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.model.BaseModel;
-
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import java.lang.reflect.Method;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Ryan Park
- */
-public class ClpSerializer {
-	public static String getServletContextName() {
-		if (Validator.isNotNull(_servletContextName)) {
-			return _servletContextName;
-		}
-
-		synchronized (ClpSerializer.class) {
-			if (Validator.isNotNull(_servletContextName)) {
-				return _servletContextName;
-			}
-
-			try {
-				ClassLoader classLoader = ClpSerializer.class.getClassLoader();
-
-				Class<?> portletPropsClass = classLoader.loadClass(
-						"com.liferay.util.portlet.PortletProps");
-
-				Method getMethod = portletPropsClass.getMethod("get",
-						new Class<?>[] { String.class });
-
-				String portletPropsServletContextName = (String)getMethod.invoke(null,
-						"marketplace-portlet-deployment-context");
-
-				if (Validator.isNotNull(portletPropsServletContextName)) {
-					_servletContextName = portletPropsServletContextName;
-				}
-			}
-			catch (Throwable t) {
-				if (_log.isInfoEnabled()) {
-					_log.info(
-						"Unable to locate deployment context from portlet properties");
-				}
-			}
-
-			if (Validator.isNull(_servletContextName)) {
-				try {
-					String propsUtilServletContextName = PropsUtil.get(
-							"marketplace-portlet-deployment-context");
-
-					if (Validator.isNotNull(propsUtilServletContextName)) {
-						_servletContextName = propsUtilServletContextName;
-					}
-				}
-				catch (Throwable t) {
-					if (_log.isInfoEnabled()) {
-						_log.info(
-							"Unable to locate deployment context from portal properties");
-					}
-				}
-			}
-
-			if (Validator.isNull(_servletContextName)) {
-				_servletContextName = "marketplace-portlet";
-			}
-
-			return _servletContextName;
-		}
-	}
-
-	public static Object translateInput(BaseModel<?> oldModel) {
-		Class<?> oldModelClass = oldModel.getClass();
-
-		String oldModelClassName = oldModelClass.getName();
-
-		if (oldModelClassName.equals(AppClp.class.getName())) {
-			return translateInputApp(oldModel);
-		}
-
-		if (oldModelClassName.equals(ModuleClp.class.getName())) {
-			return translateInputModule(oldModel);
-		}
-
-		return oldModel;
-	}
-
-	public static Object translateInput(List<Object> oldList) {
-		List<Object> newList = new ArrayList<Object>(oldList.size());
-
-		for (int i = 0; i < oldList.size(); i++) {
-			Object curObj = oldList.get(i);
-
-			newList.add(translateInput(curObj));
-		}
-
-		return newList;
-	}
-
-	public static Object translateInputApp(BaseModel<?> oldModel) {
-		AppClp oldClpModel = (AppClp)oldModel;
-
-		BaseModel<?> newModel = oldClpModel.getAppRemoteModel();
-
-		newModel.setModelAttributes(oldClpModel.getModelAttributes());
-
-		return newModel;
-	}
-
-	public static Object translateInputModule(BaseModel<?> oldModel) {
-		ModuleClp oldClpModel = (ModuleClp)oldModel;
-
-		BaseModel<?> newModel = oldClpModel.getModuleRemoteModel();
-
-		newModel.setModelAttributes(oldClpModel.getModelAttributes());
-
-		return newModel;
-	}
-
-	public static Object translateInput(Object obj) {
-		if (obj instanceof BaseModel<?>) {
-			return translateInput((BaseModel<?>)obj);
-		}
-		else if (obj instanceof List<?>) {
-			return translateInput((List<Object>)obj);
-		}
-		else {
-			return obj;
-		}
-	}
-
-	public static Object translateOutput(BaseModel<?> oldModel) {
-		Class<?> oldModelClass = oldModel.getClass();
-
-		String oldModelClassName = oldModelClass.getName();
-
-		if (oldModelClassName.equals(
-					"com.liferay.marketplace.model.impl.AppImpl")) {
-			return translateOutputApp(oldModel);
-		}
-
-		if (oldModelClassName.equals(
-					"com.liferay.marketplace.model.impl.ModuleImpl")) {
-			return translateOutputModule(oldModel);
-		}
-
-		return oldModel;
-	}
-
-	public static Object translateOutput(List<Object> oldList) {
-		List<Object> newList = new ArrayList<Object>(oldList.size());
-
-		for (int i = 0; i < oldList.size(); i++) {
-			Object curObj = oldList.get(i);
-
-			newList.add(translateOutput(curObj));
-		}
-
-		return newList;
-	}
-
-	public static Object translateOutput(Object obj) {
-		if (obj instanceof BaseModel<?>) {
-			return translateOutput((BaseModel<?>)obj);
-		}
-		else if (obj instanceof List<?>) {
-			return translateOutput((List<Object>)obj);
-		}
-		else {
-			return obj;
-		}
-	}
-
-	public static Throwable translateThrowable(Throwable throwable) {
-		if (_useReflectionToTranslateThrowable) {
-			try {
-				UnsyncByteArrayOutputStream unsyncByteArrayOutputStream = new UnsyncByteArrayOutputStream();
-				ObjectOutputStream objectOutputStream = new ObjectOutputStream(unsyncByteArrayOutputStream);
-
-				objectOutputStream.writeObject(throwable);
-
-				objectOutputStream.flush();
-				objectOutputStream.close();
-
-				UnsyncByteArrayInputStream unsyncByteArrayInputStream = new UnsyncByteArrayInputStream(unsyncByteArrayOutputStream.unsafeGetByteArray(),
-						0, unsyncByteArrayOutputStream.size());
-
-				Thread currentThread = Thread.currentThread();
-
-				ClassLoader contextClassLoader = currentThread.getContextClassLoader();
-
-				ObjectInputStream objectInputStream = new ClassLoaderObjectInputStream(unsyncByteArrayInputStream,
-						contextClassLoader);
-
-				throwable = (Throwable)objectInputStream.readObject();
-
-				objectInputStream.close();
-
-				return throwable;
-			}
-			catch (SecurityException se) {
-				if (_log.isInfoEnabled()) {
-					_log.info("Do not use reflection to translate throwable");
-				}
-
-				_useReflectionToTranslateThrowable = false;
-			}
-			catch (Throwable throwable2) {
-				_log.error(throwable2, throwable2);
-
-				return throwable2;
-			}
-		}
-
-		Class<?> clazz = throwable.getClass();
-
-		String className = clazz.getName();
-
-		if (className.equals(PortalException.class.getName())) {
-			return new PortalException();
-		}
-
-		if (className.equals(SystemException.class.getName())) {
-			return new SystemException();
-		}
-
-		if (className.equals("com.liferay.marketplace.AppPropertiesException")) {
-			return new com.liferay.marketplace.AppPropertiesException();
-		}
-
-		if (className.equals("com.liferay.marketplace.AppTitleException")) {
-			return new com.liferay.marketplace.AppTitleException();
-		}
-
-		if (className.equals("com.liferay.marketplace.AppVersionException")) {
-			return new com.liferay.marketplace.AppVersionException();
-		}
-
-		if (className.equals("com.liferay.marketplace.DuplicateAppException")) {
-			return new com.liferay.marketplace.DuplicateAppException();
-		}
-
-		if (className.equals("com.liferay.marketplace.NoSuchAppException")) {
-			return new com.liferay.marketplace.NoSuchAppException();
-		}
-
-		if (className.equals("com.liferay.marketplace.NoSuchModuleException")) {
-			return new com.liferay.marketplace.NoSuchModuleException();
-		}
-
-		return throwable;
-	}
-
-	public static Object translateOutputApp(BaseModel<?> oldModel) {
-		AppClp newModel = new AppClp();
-
-		newModel.setModelAttributes(oldModel.getModelAttributes());
-
-		newModel.setAppRemoteModel(oldModel);
-
-		return newModel;
-	}
-
-	public static Object translateOutputModule(BaseModel<?> oldModel) {
-		ModuleClp newModel = new ModuleClp();
-
-		newModel.setModelAttributes(oldModel.getModelAttributes());
-
-		newModel.setModuleRemoteModel(oldModel);
-
-		return newModel;
-	}
-
-	private static Log _log = LogFactoryUtil.getLog(ClpSerializer.class);
-	private static String _servletContextName;
-	private static boolean _useReflectionToTranslateThrowable = true;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalService.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalService.java
deleted file mode 100644
index bc5a8d5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalService.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.transaction.Isolation;
-import com.liferay.portal.kernel.transaction.Propagation;
-import com.liferay.portal.kernel.transaction.Transactional;
-import com.liferay.portal.service.BaseLocalService;
-import com.liferay.portal.service.InvokableLocalService;
-import com.liferay.portal.service.PersistedModelLocalService;
-
-/**
- * Provides the local service interface for Module. Methods of this
- * service will not have security checks based on the propagated JAAS
- * credentials because this service can only be accessed from within the same
- * VM.
- *
- * @author Ryan Park
- * @see ModuleLocalServiceUtil
- * @see com.liferay.marketplace.service.base.ModuleLocalServiceBaseImpl
- * @see com.liferay.marketplace.service.impl.ModuleLocalServiceImpl
- * @generated
- */
-@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
-	PortalException.class, SystemException.class})
-public interface ModuleLocalService extends BaseLocalService,
-	InvokableLocalService, PersistedModelLocalService {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. Always use {@link ModuleLocalServiceUtil} to access the module local service. Add custom service methods to {@link com.liferay.marketplace.service.impl.ModuleLocalServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
-	 */
-
-	/**
-	* Adds the module to the database. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was added
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module addModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Creates a new module with the primary key. Does not add the module to the database.
-	*
-	* @param moduleId the primary key for the new module
-	* @return the new module
-	*/
-	public com.liferay.marketplace.model.Module createModule(long moduleId);
-
-	/**
-	* Deletes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module that was removed
-	* @throws PortalException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module deleteModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Deletes the module from the database. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module deleteModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery();
-
-	/**
-	* Performs a dynamic query on the database and returns the matching rows.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Performs a dynamic query on the database and returns a range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @return the range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @param projection the projection to apply to the query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.Module fetchModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the module with the primary key.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module
-	* @throws PortalException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.Module getModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	@Override
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public java.util.List<com.liferay.marketplace.model.Module> getModules(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of modules.
-	*
-	* @return the number of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public int getModulesCount()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Updates the module in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was updated
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module updateModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	public java.lang.String getBeanIdentifier();
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	public void setBeanIdentifier(java.lang.String beanIdentifier);
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable;
-
-	public com.liferay.marketplace.model.Module addModule(long userId,
-		long appId, java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public com.liferay.marketplace.model.Module fetchModule(long appId,
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
-	public java.util.List<com.liferay.marketplace.model.Module> getModules(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceClp.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceClp.java
deleted file mode 100644
index cb84eb7..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceClp.java
+++ /dev/null
@@ -1,819 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.service.InvokableLocalService;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class ModuleLocalServiceClp implements ModuleLocalService {
-	public ModuleLocalServiceClp(InvokableLocalService invokableLocalService) {
-		_invokableLocalService = invokableLocalService;
-
-		_methodName0 = "addModule";
-
-		_methodParameterTypes0 = new String[] {
-				"com.liferay.marketplace.model.Module"
-			};
-
-		_methodName1 = "createModule";
-
-		_methodParameterTypes1 = new String[] { "long" };
-
-		_methodName2 = "deleteModule";
-
-		_methodParameterTypes2 = new String[] { "long" };
-
-		_methodName3 = "deleteModule";
-
-		_methodParameterTypes3 = new String[] {
-				"com.liferay.marketplace.model.Module"
-			};
-
-		_methodName4 = "dynamicQuery";
-
-		_methodParameterTypes4 = new String[] {  };
-
-		_methodName5 = "dynamicQuery";
-
-		_methodParameterTypes5 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName6 = "dynamicQuery";
-
-		_methodParameterTypes6 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int"
-			};
-
-		_methodName7 = "dynamicQuery";
-
-		_methodParameterTypes7 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int",
-				"com.liferay.portal.kernel.util.OrderByComparator"
-			};
-
-		_methodName8 = "dynamicQueryCount";
-
-		_methodParameterTypes8 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName9 = "dynamicQueryCount";
-
-		_methodParameterTypes9 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery",
-				"com.liferay.portal.kernel.dao.orm.Projection"
-			};
-
-		_methodName10 = "fetchModule";
-
-		_methodParameterTypes10 = new String[] { "long" };
-
-		_methodName11 = "getModule";
-
-		_methodParameterTypes11 = new String[] { "long" };
-
-		_methodName12 = "getPersistedModel";
-
-		_methodParameterTypes12 = new String[] { "java.io.Serializable" };
-
-		_methodName13 = "getModules";
-
-		_methodParameterTypes13 = new String[] { "int", "int" };
-
-		_methodName14 = "getModulesCount";
-
-		_methodParameterTypes14 = new String[] {  };
-
-		_methodName15 = "updateModule";
-
-		_methodParameterTypes15 = new String[] {
-				"com.liferay.marketplace.model.Module"
-			};
-
-		_methodName16 = "getBeanIdentifier";
-
-		_methodParameterTypes16 = new String[] {  };
-
-		_methodName17 = "setBeanIdentifier";
-
-		_methodParameterTypes17 = new String[] { "java.lang.String" };
-
-		_methodName19 = "addModule";
-
-		_methodParameterTypes19 = new String[] {
-				"long", "long", "java.lang.String"
-			};
-
-		_methodName20 = "fetchModule";
-
-		_methodParameterTypes20 = new String[] { "long", "java.lang.String" };
-
-		_methodName21 = "getModules";
-
-		_methodParameterTypes21 = new String[] { "long" };
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module addModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName0,
-					_methodParameterTypes0,
-					new Object[] { ClpSerializer.translateInput(module) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module createModule(long moduleId) {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName1,
-					_methodParameterTypes1, new Object[] { moduleId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module deleteModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName2,
-					_methodParameterTypes2, new Object[] { moduleId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module deleteModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName3,
-					_methodParameterTypes3,
-					new Object[] { ClpSerializer.translateInput(module) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName4,
-					_methodParameterTypes4, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.portal.kernel.dao.orm.DynamicQuery)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName5,
-					_methodParameterTypes5,
-					new Object[] { ClpSerializer.translateInput(dynamicQuery) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName6,
-					_methodParameterTypes6,
-					new Object[] {
-						ClpSerializer.translateInput(dynamicQuery),
-						
-					start,
-						
-					end
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName7,
-					_methodParameterTypes7,
-					new Object[] {
-						ClpSerializer.translateInput(dynamicQuery),
-						
-					start,
-						
-					end,
-						
-					ClpSerializer.translateInput(orderByComparator)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName8,
-					_methodParameterTypes8,
-					new Object[] { ClpSerializer.translateInput(dynamicQuery) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return ((Long)returnObj).longValue();
-	}
-
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName9,
-					_methodParameterTypes9,
-					new Object[] {
-						ClpSerializer.translateInput(dynamicQuery),
-						
-					ClpSerializer.translateInput(projection)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return ((Long)returnObj).longValue();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module fetchModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName10,
-					_methodParameterTypes10, new Object[] { moduleId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module getModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName11,
-					_methodParameterTypes11, new Object[] { moduleId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName12,
-					_methodParameterTypes12,
-					new Object[] { ClpSerializer.translateInput(primaryKeyObj) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.PortalException) {
-				throw (com.liferay.portal.kernel.exception.PortalException)t;
-			}
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.portal.model.PersistedModel)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.Module> getModules(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName13,
-					_methodParameterTypes13, new Object[] { start, end });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List<com.liferay.marketplace.model.Module>)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public int getModulesCount()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName14,
-					_methodParameterTypes14, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return ((Integer)returnObj).intValue();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module updateModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName15,
-					_methodParameterTypes15,
-					new Object[] { ClpSerializer.translateInput(module) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.lang.String getBeanIdentifier() {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName16,
-					_methodParameterTypes16, new Object[] {  });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.lang.String)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public void setBeanIdentifier(java.lang.String beanIdentifier) {
-		try {
-			_invokableLocalService.invokeMethod(_methodName17,
-				_methodParameterTypes17,
-				new Object[] { ClpSerializer.translateInput(beanIdentifier) });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-	}
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		throw new UnsupportedOperationException();
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module addModule(long userId,
-		long appId, java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName19,
-					_methodParameterTypes19,
-					new Object[] {
-						userId,
-						
-					appId,
-						
-					ClpSerializer.translateInput(contextName)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module fetchModule(long appId,
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName20,
-					_methodParameterTypes20,
-					new Object[] {
-						appId,
-						
-					ClpSerializer.translateInput(contextName)
-					});
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (com.liferay.marketplace.model.Module)ClpSerializer.translateOutput(returnObj);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.Module> getModules(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException {
-		Object returnObj = null;
-
-		try {
-			returnObj = _invokableLocalService.invokeMethod(_methodName21,
-					_methodParameterTypes21, new Object[] { appId });
-		}
-		catch (Throwable t) {
-			t = ClpSerializer.translateThrowable(t);
-
-			if (t instanceof com.liferay.portal.kernel.exception.SystemException) {
-				throw (com.liferay.portal.kernel.exception.SystemException)t;
-			}
-
-			if (t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			else {
-				throw new RuntimeException(t.getClass().getName() +
-					" is not a valid exception");
-			}
-		}
-
-		return (java.util.List<com.liferay.marketplace.model.Module>)ClpSerializer.translateOutput(returnObj);
-	}
-
-	private InvokableLocalService _invokableLocalService;
-	private String _methodName0;
-	private String[] _methodParameterTypes0;
-	private String _methodName1;
-	private String[] _methodParameterTypes1;
-	private String _methodName2;
-	private String[] _methodParameterTypes2;
-	private String _methodName3;
-	private String[] _methodParameterTypes3;
-	private String _methodName4;
-	private String[] _methodParameterTypes4;
-	private String _methodName5;
-	private String[] _methodParameterTypes5;
-	private String _methodName6;
-	private String[] _methodParameterTypes6;
-	private String _methodName7;
-	private String[] _methodParameterTypes7;
-	private String _methodName8;
-	private String[] _methodParameterTypes8;
-	private String _methodName9;
-	private String[] _methodParameterTypes9;
-	private String _methodName10;
-	private String[] _methodParameterTypes10;
-	private String _methodName11;
-	private String[] _methodParameterTypes11;
-	private String _methodName12;
-	private String[] _methodParameterTypes12;
-	private String _methodName13;
-	private String[] _methodParameterTypes13;
-	private String _methodName14;
-	private String[] _methodParameterTypes14;
-	private String _methodName15;
-	private String[] _methodParameterTypes15;
-	private String _methodName16;
-	private String[] _methodParameterTypes16;
-	private String _methodName17;
-	private String[] _methodParameterTypes17;
-	private String _methodName19;
-	private String[] _methodParameterTypes19;
-	private String _methodName20;
-	private String[] _methodParameterTypes20;
-	private String _methodName21;
-	private String[] _methodParameterTypes21;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceUtil.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceUtil.java
deleted file mode 100644
index 190b1fe..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceUtil.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
-import com.liferay.portal.kernel.util.ReferenceRegistry;
-import com.liferay.portal.service.InvokableLocalService;
-
-/**
- * Provides the local service utility for Module. This utility wraps
- * {@link com.liferay.marketplace.service.impl.ModuleLocalServiceImpl} and is the
- * primary access point for service operations in application layer code running
- * on the local server. Methods of this service will not have security checks
- * based on the propagated JAAS credentials because this service can only be
- * accessed from within the same VM.
- *
- * @author Ryan Park
- * @see ModuleLocalService
- * @see com.liferay.marketplace.service.base.ModuleLocalServiceBaseImpl
- * @see com.liferay.marketplace.service.impl.ModuleLocalServiceImpl
- * @generated
- */
-public class ModuleLocalServiceUtil {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this class directly. Add custom service methods to {@link com.liferay.marketplace.service.impl.ModuleLocalServiceImpl} and rerun ServiceBuilder to regenerate this class.
-	 */
-
-	/**
-	* Adds the module to the database. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was added
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module addModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().addModule(module);
-	}
-
-	/**
-	* Creates a new module with the primary key. Does not add the module to the database.
-	*
-	* @param moduleId the primary key for the new module
-	* @return the new module
-	*/
-	public static com.liferay.marketplace.model.Module createModule(
-		long moduleId) {
-		return getService().createModule(moduleId);
-	}
-
-	/**
-	* Deletes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module that was removed
-	* @throws PortalException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module deleteModule(
-		long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().deleteModule(moduleId);
-	}
-
-	/**
-	* Deletes the module from the database. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module deleteModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().deleteModule(module);
-	}
-
-	public static com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
-		return getService().dynamicQuery();
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns the matching rows.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public static java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQuery(dynamicQuery);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns a range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @return the range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public static java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@SuppressWarnings("rawtypes")
-	public static java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService()
-				   .dynamicQuery(dynamicQuery, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public static long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQueryCount(dynamicQuery);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @param projection the projection to apply to the query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	public static long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().dynamicQueryCount(dynamicQuery, projection);
-	}
-
-	public static com.liferay.marketplace.model.Module fetchModule(
-		long moduleId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().fetchModule(moduleId);
-	}
-
-	/**
-	* Returns the module with the primary key.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module
-	* @throws PortalException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module getModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().getModule(moduleId);
-	}
-
-	public static com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getService().getPersistedModel(primaryKeyObj);
-	}
-
-	/**
-	* Returns a range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> getModules(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getModules(start, end);
-	}
-
-	/**
-	* Returns the number of modules.
-	*
-	* @return the number of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int getModulesCount()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getModulesCount();
-	}
-
-	/**
-	* Updates the module in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was updated
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module updateModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().updateModule(module);
-	}
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	public static java.lang.String getBeanIdentifier() {
-		return getService().getBeanIdentifier();
-	}
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	public static void setBeanIdentifier(java.lang.String beanIdentifier) {
-		getService().setBeanIdentifier(beanIdentifier);
-	}
-
-	public static java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		return getService().invokeMethod(name, parameterTypes, arguments);
-	}
-
-	public static com.liferay.marketplace.model.Module addModule(long userId,
-		long appId, java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().addModule(userId, appId, contextName);
-	}
-
-	public static com.liferay.marketplace.model.Module fetchModule(long appId,
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().fetchModule(appId, contextName);
-	}
-
-	public static java.util.List<com.liferay.marketplace.model.Module> getModules(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException {
-		return getService().getModules(appId);
-	}
-
-	public static void clearService() {
-		_service = null;
-	}
-
-	public static ModuleLocalService getService() {
-		if (_service == null) {
-			InvokableLocalService invokableLocalService = (InvokableLocalService)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),
-					ModuleLocalService.class.getName());
-
-			if (invokableLocalService instanceof ModuleLocalService) {
-				_service = (ModuleLocalService)invokableLocalService;
-			}
-			else {
-				_service = new ModuleLocalServiceClp(invokableLocalService);
-			}
-
-			ReferenceRegistry.registerReference(ModuleLocalServiceUtil.class,
-				"_service");
-		}
-
-		return _service;
-	}
-
-	/**
-	 * @deprecated As of 6.2.0
-	 */
-	public void setService(ModuleLocalService service) {
-	}
-
-	private static ModuleLocalService _service;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceWrapper.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceWrapper.java
deleted file mode 100644
index 1aa9b57..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/ModuleLocalServiceWrapper.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service;
-
-import com.liferay.portal.service.ServiceWrapper;
-
-/**
- * Provides a wrapper for {@link ModuleLocalService}.
- *
- * @author Ryan Park
- * @see ModuleLocalService
- * @generated
- */
-public class ModuleLocalServiceWrapper implements ModuleLocalService,
-	ServiceWrapper<ModuleLocalService> {
-	public ModuleLocalServiceWrapper(ModuleLocalService moduleLocalService) {
-		_moduleLocalService = moduleLocalService;
-	}
-
-	/**
-	* Adds the module to the database. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was added
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.Module addModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.addModule(module);
-	}
-
-	/**
-	* Creates a new module with the primary key. Does not add the module to the database.
-	*
-	* @param moduleId the primary key for the new module
-	* @return the new module
-	*/
-	@Override
-	public com.liferay.marketplace.model.Module createModule(long moduleId) {
-		return _moduleLocalService.createModule(moduleId);
-	}
-
-	/**
-	* Deletes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module that was removed
-	* @throws PortalException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.Module deleteModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.deleteModule(moduleId);
-	}
-
-	/**
-	* Deletes the module from the database. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.Module deleteModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.deleteModule(module);
-	}
-
-	@Override
-	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
-		return _moduleLocalService.dynamicQuery();
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns the matching rows.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.dynamicQuery(dynamicQuery);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns a range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @return the range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end) throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.dynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	* Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param dynamicQuery the dynamic query
-	* @param start the lower bound of the range of model instances
-	* @param end the upper bound of the range of model instances (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching rows
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	@SuppressWarnings("rawtypes")
-	public java.util.List dynamicQuery(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
-		int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.dynamicQuery(dynamicQuery, start, end,
-			orderByComparator);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.dynamicQueryCount(dynamicQuery);
-	}
-
-	/**
-	* Returns the number of rows that match the dynamic query.
-	*
-	* @param dynamicQuery the dynamic query
-	* @param projection the projection to apply to the query
-	* @return the number of rows that match the dynamic query
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public long dynamicQueryCount(
-		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
-		com.liferay.portal.kernel.dao.orm.Projection projection)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.dynamicQueryCount(dynamicQuery, projection);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module fetchModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.fetchModule(moduleId);
-	}
-
-	/**
-	* Returns the module with the primary key.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module
-	* @throws PortalException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.Module getModule(long moduleId)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.getModule(moduleId);
-	}
-
-	@Override
-	public com.liferay.portal.model.PersistedModel getPersistedModel(
-		java.io.Serializable primaryKeyObj)
-		throws com.liferay.portal.kernel.exception.PortalException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.getPersistedModel(primaryKeyObj);
-	}
-
-	/**
-	* Returns a range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public java.util.List<com.liferay.marketplace.model.Module> getModules(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.getModules(start, end);
-	}
-
-	/**
-	* Returns the number of modules.
-	*
-	* @return the number of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public int getModulesCount()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.getModulesCount();
-	}
-
-	/**
-	* Updates the module in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	*
-	* @param module the module
-	* @return the module that was updated
-	* @throws SystemException if a system exception occurred
-	*/
-	@Override
-	public com.liferay.marketplace.model.Module updateModule(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.updateModule(module);
-	}
-
-	/**
-	* Returns the Spring bean ID for this bean.
-	*
-	* @return the Spring bean ID for this bean
-	*/
-	@Override
-	public java.lang.String getBeanIdentifier() {
-		return _moduleLocalService.getBeanIdentifier();
-	}
-
-	/**
-	* Sets the Spring bean ID for this bean.
-	*
-	* @param beanIdentifier the Spring bean ID for this bean
-	*/
-	@Override
-	public void setBeanIdentifier(java.lang.String beanIdentifier) {
-		_moduleLocalService.setBeanIdentifier(beanIdentifier);
-	}
-
-	@Override
-	public java.lang.Object invokeMethod(java.lang.String name,
-		java.lang.String[] parameterTypes, java.lang.Object[] arguments)
-		throws java.lang.Throwable {
-		return _moduleLocalService.invokeMethod(name, parameterTypes, arguments);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module addModule(long userId,
-		long appId, java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.addModule(userId, appId, contextName);
-	}
-
-	@Override
-	public com.liferay.marketplace.model.Module fetchModule(long appId,
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.fetchModule(appId, contextName);
-	}
-
-	@Override
-	public java.util.List<com.liferay.marketplace.model.Module> getModules(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException {
-		return _moduleLocalService.getModules(appId);
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #getWrappedService}
-	 */
-	public ModuleLocalService getWrappedModuleLocalService() {
-		return _moduleLocalService;
-	}
-
-	/**
-	 * @deprecated As of 6.1.0, replaced by {@link #setWrappedService}
-	 */
-	public void setWrappedModuleLocalService(
-		ModuleLocalService moduleLocalService) {
-		_moduleLocalService = moduleLocalService;
-	}
-
-	@Override
-	public ModuleLocalService getWrappedService() {
-		return _moduleLocalService;
-	}
-
-	@Override
-	public void setWrappedService(ModuleLocalService moduleLocalService) {
-		_moduleLocalService = moduleLocalService;
-	}
-
-	private ModuleLocalService _moduleLocalService;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/messaging/ClpMessageListener.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/messaging/ClpMessageListener.java
deleted file mode 100644
index 4b59105..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/messaging/ClpMessageListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.messaging;
-
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-import com.liferay.marketplace.service.AppServiceUtil;
-import com.liferay.marketplace.service.ClpSerializer;
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-
-import com.liferay.portal.kernel.messaging.BaseMessageListener;
-import com.liferay.portal.kernel.messaging.Message;
-
-/**
- * @author Ryan Park
- */
-public class ClpMessageListener extends BaseMessageListener {
-	public static String getServletContextName() {
-		return ClpSerializer.getServletContextName();
-	}
-
-	@Override
-	protected void doReceive(Message message) throws Exception {
-		String command = message.getString("command");
-		String servletContextName = message.getString("servletContextName");
-
-		if (command.equals("undeploy") &&
-				servletContextName.equals(getServletContextName())) {
-			AppLocalServiceUtil.clearService();
-
-			AppServiceUtil.clearService();
-			ModuleLocalServiceUtil.clearService();
-		}
-	}
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppActionableDynamicQuery.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppActionableDynamicQuery.java
deleted file mode 100644
index e1458b0..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppActionableDynamicQuery.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-
-import com.liferay.portal.kernel.dao.orm.BaseActionableDynamicQuery;
-import com.liferay.portal.kernel.exception.SystemException;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public abstract class AppActionableDynamicQuery
-	extends BaseActionableDynamicQuery {
-	public AppActionableDynamicQuery() throws SystemException {
-		setBaseLocalService(AppLocalServiceUtil.getService());
-		setClass(App.class);
-
-		setClassLoader(com.liferay.marketplace.service.ClpSerializer.class.getClassLoader());
-
-		setPrimaryKeyPropertyName("appId");
-	}
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppExportActionableDynamicQuery.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppExportActionableDynamicQuery.java
deleted file mode 100644
index 50e019b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppExportActionableDynamicQuery.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.App;
-
-import com.liferay.portal.kernel.dao.orm.DynamicQuery;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.lar.ExportImportHelperUtil;
-import com.liferay.portal.kernel.lar.ManifestSummary;
-import com.liferay.portal.kernel.lar.PortletDataContext;
-import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
-import com.liferay.portal.kernel.lar.StagedModelType;
-import com.liferay.portal.util.PortalUtil;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class AppExportActionableDynamicQuery extends AppActionableDynamicQuery {
-	public AppExportActionableDynamicQuery(
-		PortletDataContext portletDataContext) throws SystemException {
-		_portletDataContext = portletDataContext;
-
-		setCompanyId(_portletDataContext.getCompanyId());
-	}
-
-	@Override
-	public long performCount() throws PortalException, SystemException {
-		ManifestSummary manifestSummary = _portletDataContext.getManifestSummary();
-
-		StagedModelType stagedModelType = getStagedModelType();
-
-		long modelAdditionCount = super.performCount();
-
-		manifestSummary.addModelAdditionCount(stagedModelType.toString(),
-			modelAdditionCount);
-
-		long modelDeletionCount = ExportImportHelperUtil.getModelDeletionCount(_portletDataContext,
-				stagedModelType);
-
-		manifestSummary.addModelDeletionCount(stagedModelType.toString(),
-			modelDeletionCount);
-
-		return modelAdditionCount;
-	}
-
-	@Override
-	protected void addCriteria(DynamicQuery dynamicQuery) {
-		_portletDataContext.addDateRangeCriteria(dynamicQuery, "modifiedDate");
-	}
-
-	protected StagedModelType getStagedModelType() {
-		return new StagedModelType(PortalUtil.getClassNameId(
-				App.class.getName()));
-	}
-
-	@Override
-	@SuppressWarnings("unused")
-	protected void performAction(Object object)
-		throws PortalException, SystemException {
-		App stagedModel = (App)object;
-
-		StagedModelDataHandlerUtil.exportStagedModel(_portletDataContext,
-			stagedModel);
-	}
-
-	private PortletDataContext _portletDataContext;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppPersistence.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppPersistence.java
deleted file mode 100644
index f1ebbde..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppPersistence.java
+++ /dev/null
@@ -1,779 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.App;
-
-import com.liferay.portal.service.persistence.BasePersistence;
-
-/**
- * The persistence interface for the app service.
- *
- * <p>
- * Caching information and settings can be found in <code>portal.properties</code>
- * </p>
- *
- * @author Ryan Park
- * @see AppPersistenceImpl
- * @see AppUtil
- * @generated
- */
-public interface AppPersistence extends BasePersistence<App> {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. Always use {@link AppUtil} to access the app persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this interface.
-	 */
-
-	/**
-	* Returns all the apps where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByUuid(
-		java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the apps where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByUuid(
-		java.lang.String uuid, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the apps where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByUuid(
-		java.lang.String uuid, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where uuid = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App[] findByUuid_PrevAndNext(
-		long appId, java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the apps where uuid = &#63; from the database.
-	*
-	* @param uuid the uuid
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the apps where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByUuid_C(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the apps where uuid = &#63; and companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByUuid_C(
-		java.lang.String uuid, long companyId, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the apps where uuid = &#63; and companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByUuid_C(
-		java.lang.String uuid, long companyId, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByUuid_C_First(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByUuid_C_First(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByUuid_C_Last(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByUuid_C_Last(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App[] findByUuid_C_PrevAndNext(
-		long appId, java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the apps where uuid = &#63; and companyId = &#63; from the database.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByUuid_C(java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByUuid_C(java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the apps where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByCompanyId(
-		long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the apps where companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByCompanyId(
-		long companyId, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the apps where companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByCompanyId(
-		long companyId, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByCompanyId_First(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByCompanyId_First(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByCompanyId_Last(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByCompanyId_Last(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where companyId = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App[] findByCompanyId_PrevAndNext(
-		long appId, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the apps where companyId = &#63; from the database.
-	*
-	* @param companyId the company ID
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByCompanyId(long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByCompanyId(long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app where remoteAppId = &#63; or throws a {@link com.liferay.marketplace.NoSuchAppException} if it could not be found.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByRemoteAppId(long remoteAppId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app where remoteAppId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByRemoteAppId(
-		long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app where remoteAppId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
-	*
-	* @param remoteAppId the remote app ID
-	* @param retrieveFromCache whether to use the finder cache
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByRemoteAppId(
-		long remoteAppId, boolean retrieveFromCache)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes the app where remoteAppId = &#63; from the database.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the app that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App removeByRemoteAppId(
-		long remoteAppId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps where remoteAppId = &#63;.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByRemoteAppId(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the apps where category = &#63;.
-	*
-	* @param category the category
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByCategory(
-		java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the apps where category = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param category the category
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByCategory(
-		java.lang.String category, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the apps where category = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param category the category
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findByCategory(
-		java.lang.String category, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByCategory_First(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByCategory_First(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByCategory_Last(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByCategory_Last(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where category = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App[] findByCategory_PrevAndNext(
-		long appId, java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the apps where category = &#63; from the database.
-	*
-	* @param category the category
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByCategory(java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps where category = &#63;.
-	*
-	* @param category the category
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByCategory(java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Caches the app in the entity cache if it is enabled.
-	*
-	* @param app the app
-	*/
-	public void cacheResult(com.liferay.marketplace.model.App app);
-
-	/**
-	* Caches the apps in the entity cache if it is enabled.
-	*
-	* @param apps the apps
-	*/
-	public void cacheResult(
-		java.util.List<com.liferay.marketplace.model.App> apps);
-
-	/**
-	* Creates a new app with the primary key. Does not add the app to the database.
-	*
-	* @param appId the primary key for the new app
-	* @return the new app
-	*/
-	public com.liferay.marketplace.model.App create(long appId);
-
-	/**
-	* Removes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param appId the primary key of the app
-	* @return the app that was removed
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App remove(long appId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.marketplace.model.App updateImpl(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app with the primary key or throws a {@link com.liferay.marketplace.NoSuchAppException} if it could not be found.
-	*
-	* @param appId the primary key of the app
-	* @return the app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App findByPrimaryKey(long appId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the app with the primary key or returns <code>null</code> if it could not be found.
-	*
-	* @param appId the primary key of the app
-	* @return the app, or <code>null</code> if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.App fetchByPrimaryKey(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the apps.
-	*
-	* @return the apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findAll()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findAll(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.App> findAll(
-		int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the apps from the database.
-	*
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeAll()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of apps.
-	*
-	* @return the number of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countAll()
-		throws com.liferay.portal.kernel.exception.SystemException;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppUtil.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppUtil.java
deleted file mode 100644
index 02aace0..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/AppUtil.java
+++ /dev/null
@@ -1,1004 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.App;
-
-import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
-import com.liferay.portal.kernel.dao.orm.DynamicQuery;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.kernel.util.ReferenceRegistry;
-import com.liferay.portal.service.ServiceContext;
-
-import java.util.List;
-
-/**
- * The persistence utility for the app service. This utility wraps {@link AppPersistenceImpl} and provides direct access to the database for CRUD operations. This utility should only be used by the service layer, as it must operate within a transaction. Never access this utility in a JSP, controller, model, or other front-end class.
- *
- * <p>
- * Caching information and settings can be found in <code>portal.properties</code>
- * </p>
- *
- * @author Ryan Park
- * @see AppPersistence
- * @see AppPersistenceImpl
- * @generated
- */
-public class AppUtil {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this class directly. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
-	 */
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#clearCache()
-	 */
-	public static void clearCache() {
-		getPersistence().clearCache();
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#clearCache(com.liferay.portal.model.BaseModel)
-	 */
-	public static void clearCache(App app) {
-		getPersistence().clearCache(app);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#countWithDynamicQuery(DynamicQuery)
-	 */
-	public static long countWithDynamicQuery(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return getPersistence().countWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery)
-	 */
-	public static List<App> findWithDynamicQuery(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return getPersistence().findWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int)
-	 */
-	public static List<App> findWithDynamicQuery(DynamicQuery dynamicQuery,
-		int start, int end) throws SystemException {
-		return getPersistence().findWithDynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int, OrderByComparator)
-	 */
-	public static List<App> findWithDynamicQuery(DynamicQuery dynamicQuery,
-		int start, int end, OrderByComparator orderByComparator)
-		throws SystemException {
-		return getPersistence()
-				   .findWithDynamicQuery(dynamicQuery, start, end,
-			orderByComparator);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#update(com.liferay.portal.model.BaseModel)
-	 */
-	public static App update(App app) throws SystemException {
-		return getPersistence().update(app);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#update(com.liferay.portal.model.BaseModel, ServiceContext)
-	 */
-	public static App update(App app, ServiceContext serviceContext)
-		throws SystemException {
-		return getPersistence().update(app, serviceContext);
-	}
-
-	/**
-	* Returns all the apps where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByUuid(
-		java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid(uuid);
-	}
-
-	/**
-	* Returns a range of all the apps where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByUuid(
-		java.lang.String uuid, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid(uuid, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the apps where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByUuid(
-		java.lang.String uuid, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid(uuid, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid_First(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByUuid_First(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid_Last(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByUuid_Last(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where uuid = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App[] findByUuid_PrevAndNext(
-		long appId, java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByUuid_PrevAndNext(appId, uuid, orderByComparator);
-	}
-
-	/**
-	* Removes all the apps where uuid = &#63; from the database.
-	*
-	* @param uuid the uuid
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByUuid(uuid);
-	}
-
-	/**
-	* Returns the number of apps where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByUuid(uuid);
-	}
-
-	/**
-	* Returns all the apps where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByUuid_C(
-		java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid_C(uuid, companyId);
-	}
-
-	/**
-	* Returns a range of all the apps where uuid = &#63; and companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByUuid_C(
-		java.lang.String uuid, long companyId, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid_C(uuid, companyId, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the apps where uuid = &#63; and companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByUuid_C(
-		java.lang.String uuid, long companyId, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByUuid_C(uuid, companyId, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByUuid_C_First(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByUuid_C_First(uuid, companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByUuid_C_First(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByUuid_C_First(uuid, companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByUuid_C_Last(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByUuid_C_Last(uuid, companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByUuid_C_Last(
-		java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByUuid_C_Last(uuid, companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where uuid = &#63; and companyId = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App[] findByUuid_C_PrevAndNext(
-		long appId, java.lang.String uuid, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByUuid_C_PrevAndNext(appId, uuid, companyId,
-			orderByComparator);
-	}
-
-	/**
-	* Removes all the apps where uuid = &#63; and companyId = &#63; from the database.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByUuid_C(java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByUuid_C(uuid, companyId);
-	}
-
-	/**
-	* Returns the number of apps where uuid = &#63; and companyId = &#63;.
-	*
-	* @param uuid the uuid
-	* @param companyId the company ID
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByUuid_C(java.lang.String uuid, long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByUuid_C(uuid, companyId);
-	}
-
-	/**
-	* Returns all the apps where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByCompanyId(
-		long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByCompanyId(companyId);
-	}
-
-	/**
-	* Returns a range of all the apps where companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByCompanyId(
-		long companyId, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByCompanyId(companyId, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the apps where companyId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param companyId the company ID
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByCompanyId(
-		long companyId, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByCompanyId(companyId, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByCompanyId_First(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByCompanyId_First(companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByCompanyId_First(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByCompanyId_First(companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByCompanyId_Last(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByCompanyId_Last(companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByCompanyId_Last(
-		long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByCompanyId_Last(companyId, orderByComparator);
-	}
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where companyId = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param companyId the company ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App[] findByCompanyId_PrevAndNext(
-		long appId, long companyId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByCompanyId_PrevAndNext(appId, companyId,
-			orderByComparator);
-	}
-
-	/**
-	* Removes all the apps where companyId = &#63; from the database.
-	*
-	* @param companyId the company ID
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByCompanyId(long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByCompanyId(companyId);
-	}
-
-	/**
-	* Returns the number of apps where companyId = &#63;.
-	*
-	* @param companyId the company ID
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByCompanyId(long companyId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByCompanyId(companyId);
-	}
-
-	/**
-	* Returns the app where remoteAppId = &#63; or throws a {@link com.liferay.marketplace.NoSuchAppException} if it could not be found.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByRemoteAppId(
-		long remoteAppId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByRemoteAppId(remoteAppId);
-	}
-
-	/**
-	* Returns the app where remoteAppId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByRemoteAppId(
-		long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByRemoteAppId(remoteAppId);
-	}
-
-	/**
-	* Returns the app where remoteAppId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
-	*
-	* @param remoteAppId the remote app ID
-	* @param retrieveFromCache whether to use the finder cache
-	* @return the matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByRemoteAppId(
-		long remoteAppId, boolean retrieveFromCache)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByRemoteAppId(remoteAppId, retrieveFromCache);
-	}
-
-	/**
-	* Removes the app where remoteAppId = &#63; from the database.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the app that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App removeByRemoteAppId(
-		long remoteAppId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().removeByRemoteAppId(remoteAppId);
-	}
-
-	/**
-	* Returns the number of apps where remoteAppId = &#63;.
-	*
-	* @param remoteAppId the remote app ID
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByRemoteAppId(long remoteAppId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByRemoteAppId(remoteAppId);
-	}
-
-	/**
-	* Returns all the apps where category = &#63;.
-	*
-	* @param category the category
-	* @return the matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByCategory(
-		java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByCategory(category);
-	}
-
-	/**
-	* Returns a range of all the apps where category = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param category the category
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByCategory(
-		java.lang.String category, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByCategory(category, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the apps where category = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param category the category
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findByCategory(
-		java.lang.String category, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByCategory(category, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByCategory_First(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByCategory_First(category, orderByComparator);
-	}
-
-	/**
-	* Returns the first app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByCategory_First(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByCategory_First(category, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app
-	* @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByCategory_Last(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByCategory_Last(category, orderByComparator);
-	}
-
-	/**
-	* Returns the last app in the ordered set where category = &#63;.
-	*
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching app, or <code>null</code> if a matching app could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByCategory_Last(
-		java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByCategory_Last(category, orderByComparator);
-	}
-
-	/**
-	* Returns the apps before and after the current app in the ordered set where category = &#63;.
-	*
-	* @param appId the primary key of the current app
-	* @param category the category
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App[] findByCategory_PrevAndNext(
-		long appId, java.lang.String category,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByCategory_PrevAndNext(appId, category,
-			orderByComparator);
-	}
-
-	/**
-	* Removes all the apps where category = &#63; from the database.
-	*
-	* @param category the category
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByCategory(java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByCategory(category);
-	}
-
-	/**
-	* Returns the number of apps where category = &#63;.
-	*
-	* @param category the category
-	* @return the number of matching apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByCategory(java.lang.String category)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByCategory(category);
-	}
-
-	/**
-	* Caches the app in the entity cache if it is enabled.
-	*
-	* @param app the app
-	*/
-	public static void cacheResult(com.liferay.marketplace.model.App app) {
-		getPersistence().cacheResult(app);
-	}
-
-	/**
-	* Caches the apps in the entity cache if it is enabled.
-	*
-	* @param apps the apps
-	*/
-	public static void cacheResult(
-		java.util.List<com.liferay.marketplace.model.App> apps) {
-		getPersistence().cacheResult(apps);
-	}
-
-	/**
-	* Creates a new app with the primary key. Does not add the app to the database.
-	*
-	* @param appId the primary key for the new app
-	* @return the new app
-	*/
-	public static com.liferay.marketplace.model.App create(long appId) {
-		return getPersistence().create(appId);
-	}
-
-	/**
-	* Removes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param appId the primary key of the app
-	* @return the app that was removed
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App remove(long appId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().remove(appId);
-	}
-
-	public static com.liferay.marketplace.model.App updateImpl(
-		com.liferay.marketplace.model.App app)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().updateImpl(app);
-	}
-
-	/**
-	* Returns the app with the primary key or throws a {@link com.liferay.marketplace.NoSuchAppException} if it could not be found.
-	*
-	* @param appId the primary key of the app
-	* @return the app
-	* @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App findByPrimaryKey(long appId)
-		throws com.liferay.marketplace.NoSuchAppException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByPrimaryKey(appId);
-	}
-
-	/**
-	* Returns the app with the primary key or returns <code>null</code> if it could not be found.
-	*
-	* @param appId the primary key of the app
-	* @return the app, or <code>null</code> if a app with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.App fetchByPrimaryKey(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByPrimaryKey(appId);
-	}
-
-	/**
-	* Returns all the apps.
-	*
-	* @return the apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findAll()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findAll();
-	}
-
-	/**
-	* Returns a range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @return the range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findAll(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findAll(start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the apps.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of apps
-	* @param end the upper bound of the range of apps (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.App> findAll(
-		int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findAll(start, end, orderByComparator);
-	}
-
-	/**
-	* Removes all the apps from the database.
-	*
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeAll()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeAll();
-	}
-
-	/**
-	* Returns the number of apps.
-	*
-	* @return the number of apps
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countAll()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countAll();
-	}
-
-	public static AppPersistence getPersistence() {
-		if (_persistence == null) {
-			_persistence = (AppPersistence)PortletBeanLocatorUtil.locate(com.liferay.marketplace.service.ClpSerializer.getServletContextName(),
-					AppPersistence.class.getName());
-
-			ReferenceRegistry.registerReference(AppUtil.class, "_persistence");
-		}
-
-		return _persistence;
-	}
-
-	/**
-	 * @deprecated As of 6.2.0
-	 */
-	public void setPersistence(AppPersistence persistence) {
-	}
-
-	private static AppPersistence _persistence;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModuleActionableDynamicQuery.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModuleActionableDynamicQuery.java
deleted file mode 100644
index d5519df..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModuleActionableDynamicQuery.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-
-import com.liferay.portal.kernel.dao.orm.BaseActionableDynamicQuery;
-import com.liferay.portal.kernel.exception.SystemException;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public abstract class ModuleActionableDynamicQuery
-	extends BaseActionableDynamicQuery {
-	public ModuleActionableDynamicQuery() throws SystemException {
-		setBaseLocalService(ModuleLocalServiceUtil.getService());
-		setClass(Module.class);
-
-		setClassLoader(com.liferay.marketplace.service.ClpSerializer.class.getClassLoader());
-
-		setPrimaryKeyPropertyName("moduleId");
-	}
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModulePersistence.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModulePersistence.java
deleted file mode 100644
index e757dd6..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModulePersistence.java
+++ /dev/null
@@ -1,632 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.Module;
-
-import com.liferay.portal.service.persistence.BasePersistence;
-
-/**
- * The persistence interface for the module service.
- *
- * <p>
- * Caching information and settings can be found in <code>portal.properties</code>
- * </p>
- *
- * @author Ryan Park
- * @see ModulePersistenceImpl
- * @see ModuleUtil
- * @generated
- */
-public interface ModulePersistence extends BasePersistence<Module> {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this interface directly. Always use {@link ModuleUtil} to access the module persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this interface.
-	 */
-
-	/**
-	* Returns all the modules where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByUuid(
-		java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the modules where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByUuid(
-		java.lang.String uuid, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the modules where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByUuid(
-		java.lang.String uuid, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the modules before and after the current module in the ordered set where uuid = &#63;.
-	*
-	* @param moduleId the primary key of the current module
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module[] findByUuid_PrevAndNext(
-		long moduleId, java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the modules where uuid = &#63; from the database.
-	*
-	* @param uuid the uuid
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of modules where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the modules where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @return the matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByAppId(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the modules where appId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param appId the app ID
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByAppId(
-		long appId, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the modules where appId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param appId the app ID
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByAppId(
-		long appId, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByAppId_First(long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByAppId_First(long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByAppId_Last(long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByAppId_Last(long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the modules before and after the current module in the ordered set where appId = &#63;.
-	*
-	* @param moduleId the primary key of the current module
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module[] findByAppId_PrevAndNext(
-		long moduleId, long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the modules where appId = &#63; from the database.
-	*
-	* @param appId the app ID
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByAppId(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of modules where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByAppId(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the modules where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @return the matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByContextName(
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the modules where contextName = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param contextName the context name
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByContextName(
-		java.lang.String contextName, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the modules where contextName = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param contextName the context name
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findByContextName(
-		java.lang.String contextName, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByContextName_First(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the first module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByContextName_First(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByContextName_Last(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the last module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByContextName_Last(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the modules before and after the current module in the ordered set where contextName = &#63;.
-	*
-	* @param moduleId the primary key of the current module
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module[] findByContextName_PrevAndNext(
-		long moduleId, java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the modules where contextName = &#63; from the database.
-	*
-	* @param contextName the context name
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeByContextName(java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of modules where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByContextName(java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the module where appId = &#63; and contextName = &#63; or throws a {@link com.liferay.marketplace.NoSuchModuleException} if it could not be found.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByA_C(long appId,
-		java.lang.String contextName)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the module where appId = &#63; and contextName = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByA_C(long appId,
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the module where appId = &#63; and contextName = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @param retrieveFromCache whether to use the finder cache
-	* @return the matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByA_C(long appId,
-		java.lang.String contextName, boolean retrieveFromCache)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes the module where appId = &#63; and contextName = &#63; from the database.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the module that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module removeByA_C(long appId,
-		java.lang.String contextName)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of modules where appId = &#63; and contextName = &#63;.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countByA_C(long appId, java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Caches the module in the entity cache if it is enabled.
-	*
-	* @param module the module
-	*/
-	public void cacheResult(com.liferay.marketplace.model.Module module);
-
-	/**
-	* Caches the modules in the entity cache if it is enabled.
-	*
-	* @param modules the modules
-	*/
-	public void cacheResult(
-		java.util.List<com.liferay.marketplace.model.Module> modules);
-
-	/**
-	* Creates a new module with the primary key. Does not add the module to the database.
-	*
-	* @param moduleId the primary key for the new module
-	* @return the new module
-	*/
-	public com.liferay.marketplace.model.Module create(long moduleId);
-
-	/**
-	* Removes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module that was removed
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module remove(long moduleId)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	public com.liferay.marketplace.model.Module updateImpl(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the module with the primary key or throws a {@link com.liferay.marketplace.NoSuchModuleException} if it could not be found.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module findByPrimaryKey(long moduleId)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the module with the primary key or returns <code>null</code> if it could not be found.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module, or <code>null</code> if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public com.liferay.marketplace.model.Module fetchByPrimaryKey(long moduleId)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns all the modules.
-	*
-	* @return the modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findAll()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns a range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findAll(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns an ordered range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public java.util.List<com.liferay.marketplace.model.Module> findAll(
-		int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Removes all the modules from the database.
-	*
-	* @throws SystemException if a system exception occurred
-	*/
-	public void removeAll()
-		throws com.liferay.portal.kernel.exception.SystemException;
-
-	/**
-	* Returns the number of modules.
-	*
-	* @return the number of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public int countAll()
-		throws com.liferay.portal.kernel.exception.SystemException;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModuleUtil.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModuleUtil.java
deleted file mode 100644
index b9bc08a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/service/com/liferay/marketplace/service/persistence/ModuleUtil.java
+++ /dev/null
@@ -1,831 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.model.Module;
-
-import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
-import com.liferay.portal.kernel.dao.orm.DynamicQuery;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.kernel.util.ReferenceRegistry;
-import com.liferay.portal.service.ServiceContext;
-
-import java.util.List;
-
-/**
- * The persistence utility for the module service. This utility wraps {@link ModulePersistenceImpl} and provides direct access to the database for CRUD operations. This utility should only be used by the service layer, as it must operate within a transaction. Never access this utility in a JSP, controller, model, or other front-end class.
- *
- * <p>
- * Caching information and settings can be found in <code>portal.properties</code>
- * </p>
- *
- * @author Ryan Park
- * @see ModulePersistence
- * @see ModulePersistenceImpl
- * @generated
- */
-public class ModuleUtil {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify this class directly. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
-	 */
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#clearCache()
-	 */
-	public static void clearCache() {
-		getPersistence().clearCache();
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#clearCache(com.liferay.portal.model.BaseModel)
-	 */
-	public static void clearCache(Module module) {
-		getPersistence().clearCache(module);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#countWithDynamicQuery(DynamicQuery)
-	 */
-	public static long countWithDynamicQuery(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return getPersistence().countWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery)
-	 */
-	public static List<Module> findWithDynamicQuery(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return getPersistence().findWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int)
-	 */
-	public static List<Module> findWithDynamicQuery(DynamicQuery dynamicQuery,
-		int start, int end) throws SystemException {
-		return getPersistence().findWithDynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int, OrderByComparator)
-	 */
-	public static List<Module> findWithDynamicQuery(DynamicQuery dynamicQuery,
-		int start, int end, OrderByComparator orderByComparator)
-		throws SystemException {
-		return getPersistence()
-				   .findWithDynamicQuery(dynamicQuery, start, end,
-			orderByComparator);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#update(com.liferay.portal.model.BaseModel)
-	 */
-	public static Module update(Module module) throws SystemException {
-		return getPersistence().update(module);
-	}
-
-	/**
-	 * @see com.liferay.portal.service.persistence.BasePersistence#update(com.liferay.portal.model.BaseModel, ServiceContext)
-	 */
-	public static Module update(Module module, ServiceContext serviceContext)
-		throws SystemException {
-		return getPersistence().update(module, serviceContext);
-	}
-
-	/**
-	* Returns all the modules where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByUuid(
-		java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid(uuid);
-	}
-
-	/**
-	* Returns a range of all the modules where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByUuid(
-		java.lang.String uuid, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid(uuid, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the modules where uuid = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param uuid the uuid
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByUuid(
-		java.lang.String uuid, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid(uuid, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid_First(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the first module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByUuid_First(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByUuid_First(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the last module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByUuid_Last(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the last module in the ordered set where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByUuid_Last(
-		java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByUuid_Last(uuid, orderByComparator);
-	}
-
-	/**
-	* Returns the modules before and after the current module in the ordered set where uuid = &#63;.
-	*
-	* @param moduleId the primary key of the current module
-	* @param uuid the uuid
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module[] findByUuid_PrevAndNext(
-		long moduleId, java.lang.String uuid,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByUuid_PrevAndNext(moduleId, uuid, orderByComparator);
-	}
-
-	/**
-	* Removes all the modules where uuid = &#63; from the database.
-	*
-	* @param uuid the uuid
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByUuid(uuid);
-	}
-
-	/**
-	* Returns the number of modules where uuid = &#63;.
-	*
-	* @param uuid the uuid
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByUuid(java.lang.String uuid)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByUuid(uuid);
-	}
-
-	/**
-	* Returns all the modules where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @return the matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByAppId(
-		long appId) throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByAppId(appId);
-	}
-
-	/**
-	* Returns a range of all the modules where appId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param appId the app ID
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByAppId(
-		long appId, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByAppId(appId, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the modules where appId = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param appId the app ID
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByAppId(
-		long appId, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByAppId(appId, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByAppId_First(
-		long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByAppId_First(appId, orderByComparator);
-	}
-
-	/**
-	* Returns the first module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByAppId_First(
-		long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByAppId_First(appId, orderByComparator);
-	}
-
-	/**
-	* Returns the last module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByAppId_Last(
-		long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByAppId_Last(appId, orderByComparator);
-	}
-
-	/**
-	* Returns the last module in the ordered set where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByAppId_Last(
-		long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByAppId_Last(appId, orderByComparator);
-	}
-
-	/**
-	* Returns the modules before and after the current module in the ordered set where appId = &#63;.
-	*
-	* @param moduleId the primary key of the current module
-	* @param appId the app ID
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module[] findByAppId_PrevAndNext(
-		long moduleId, long appId,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByAppId_PrevAndNext(moduleId, appId, orderByComparator);
-	}
-
-	/**
-	* Removes all the modules where appId = &#63; from the database.
-	*
-	* @param appId the app ID
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByAppId(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByAppId(appId);
-	}
-
-	/**
-	* Returns the number of modules where appId = &#63;.
-	*
-	* @param appId the app ID
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByAppId(long appId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByAppId(appId);
-	}
-
-	/**
-	* Returns all the modules where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @return the matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByContextName(
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByContextName(contextName);
-	}
-
-	/**
-	* Returns a range of all the modules where contextName = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param contextName the context name
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByContextName(
-		java.lang.String contextName, int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByContextName(contextName, start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the modules where contextName = &#63;.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param contextName the context name
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findByContextName(
-		java.lang.String contextName, int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByContextName(contextName, start, end, orderByComparator);
-	}
-
-	/**
-	* Returns the first module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByContextName_First(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByContextName_First(contextName, orderByComparator);
-	}
-
-	/**
-	* Returns the first module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the first matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByContextName_First(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByContextName_First(contextName, orderByComparator);
-	}
-
-	/**
-	* Returns the last module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByContextName_Last(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByContextName_Last(contextName, orderByComparator);
-	}
-
-	/**
-	* Returns the last module in the ordered set where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the last matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByContextName_Last(
-		java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .fetchByContextName_Last(contextName, orderByComparator);
-	}
-
-	/**
-	* Returns the modules before and after the current module in the ordered set where contextName = &#63;.
-	*
-	* @param moduleId the primary key of the current module
-	* @param contextName the context name
-	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	* @return the previous, current, and next module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module[] findByContextName_PrevAndNext(
-		long moduleId, java.lang.String contextName,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence()
-				   .findByContextName_PrevAndNext(moduleId, contextName,
-			orderByComparator);
-	}
-
-	/**
-	* Removes all the modules where contextName = &#63; from the database.
-	*
-	* @param contextName the context name
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeByContextName(java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeByContextName(contextName);
-	}
-
-	/**
-	* Returns the number of modules where contextName = &#63;.
-	*
-	* @param contextName the context name
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByContextName(java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByContextName(contextName);
-	}
-
-	/**
-	* Returns the module where appId = &#63; and contextName = &#63; or throws a {@link com.liferay.marketplace.NoSuchModuleException} if it could not be found.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the matching module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByA_C(long appId,
-		java.lang.String contextName)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByA_C(appId, contextName);
-	}
-
-	/**
-	* Returns the module where appId = &#63; and contextName = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByA_C(long appId,
-		java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByA_C(appId, contextName);
-	}
-
-	/**
-	* Returns the module where appId = &#63; and contextName = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @param retrieveFromCache whether to use the finder cache
-	* @return the matching module, or <code>null</code> if a matching module could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByA_C(long appId,
-		java.lang.String contextName, boolean retrieveFromCache)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByA_C(appId, contextName, retrieveFromCache);
-	}
-
-	/**
-	* Removes the module where appId = &#63; and contextName = &#63; from the database.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the module that was removed
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module removeByA_C(long appId,
-		java.lang.String contextName)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().removeByA_C(appId, contextName);
-	}
-
-	/**
-	* Returns the number of modules where appId = &#63; and contextName = &#63;.
-	*
-	* @param appId the app ID
-	* @param contextName the context name
-	* @return the number of matching modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countByA_C(long appId, java.lang.String contextName)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countByA_C(appId, contextName);
-	}
-
-	/**
-	* Caches the module in the entity cache if it is enabled.
-	*
-	* @param module the module
-	*/
-	public static void cacheResult(com.liferay.marketplace.model.Module module) {
-		getPersistence().cacheResult(module);
-	}
-
-	/**
-	* Caches the modules in the entity cache if it is enabled.
-	*
-	* @param modules the modules
-	*/
-	public static void cacheResult(
-		java.util.List<com.liferay.marketplace.model.Module> modules) {
-		getPersistence().cacheResult(modules);
-	}
-
-	/**
-	* Creates a new module with the primary key. Does not add the module to the database.
-	*
-	* @param moduleId the primary key for the new module
-	* @return the new module
-	*/
-	public static com.liferay.marketplace.model.Module create(long moduleId) {
-		return getPersistence().create(moduleId);
-	}
-
-	/**
-	* Removes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module that was removed
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module remove(long moduleId)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().remove(moduleId);
-	}
-
-	public static com.liferay.marketplace.model.Module updateImpl(
-		com.liferay.marketplace.model.Module module)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().updateImpl(module);
-	}
-
-	/**
-	* Returns the module with the primary key or throws a {@link com.liferay.marketplace.NoSuchModuleException} if it could not be found.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module
-	* @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module findByPrimaryKey(
-		long moduleId)
-		throws com.liferay.marketplace.NoSuchModuleException,
-			com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findByPrimaryKey(moduleId);
-	}
-
-	/**
-	* Returns the module with the primary key or returns <code>null</code> if it could not be found.
-	*
-	* @param moduleId the primary key of the module
-	* @return the module, or <code>null</code> if a module with the primary key could not be found
-	* @throws SystemException if a system exception occurred
-	*/
-	public static com.liferay.marketplace.model.Module fetchByPrimaryKey(
-		long moduleId)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().fetchByPrimaryKey(moduleId);
-	}
-
-	/**
-	* Returns all the modules.
-	*
-	* @return the modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findAll()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findAll();
-	}
-
-	/**
-	* Returns a range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @return the range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findAll(
-		int start, int end)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findAll(start, end);
-	}
-
-	/**
-	* Returns an ordered range of all the modules.
-	*
-	* <p>
-	* Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	* </p>
-	*
-	* @param start the lower bound of the range of modules
-	* @param end the upper bound of the range of modules (not inclusive)
-	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	* @return the ordered range of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static java.util.List<com.liferay.marketplace.model.Module> findAll(
-		int start, int end,
-		com.liferay.portal.kernel.util.OrderByComparator orderByComparator)
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().findAll(start, end, orderByComparator);
-	}
-
-	/**
-	* Removes all the modules from the database.
-	*
-	* @throws SystemException if a system exception occurred
-	*/
-	public static void removeAll()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		getPersistence().removeAll();
-	}
-
-	/**
-	* Returns the number of modules.
-	*
-	* @return the number of modules
-	* @throws SystemException if a system exception occurred
-	*/
-	public static int countAll()
-		throws com.liferay.portal.kernel.exception.SystemException {
-		return getPersistence().countAll();
-	}
-
-	public static ModulePersistence getPersistence() {
-		if (_persistence == null) {
-			_persistence = (ModulePersistence)PortletBeanLocatorUtil.locate(com.liferay.marketplace.service.ClpSerializer.getServletContextName(),
-					ModulePersistence.class.getName());
-
-			ReferenceRegistry.registerReference(ModuleUtil.class, "_persistence");
-		}
-
-		return _persistence;
-	}
-
-	/**
-	 * @deprecated As of 6.2.0
-	 */
-	public void setPersistence(ModulePersistence persistence) {
-	}
-
-	private static ModulePersistence _persistence;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/indexes.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/indexes.properties
deleted file mode 100644
index 196bbb5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/indexes.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-IX_94A7EF25=Marketplace_App.Category
-IX_865B7BD5=Marketplace_App.CompanyId
-IX_20F14D93=Marketplace_App.RemoteAppId
-IX_3E667FE1=Marketplace_App.Uuid
-IX_A7807DA7=Marketplace_App.Uuid_C
-
-IX_C6938724=Marketplace_Module.A_C
-IX_7DC16D26=Marketplace_Module.AppId
-IX_F2F1E964=Marketplace_Module.ContextName
-IX_A7EFD80E=Marketplace_Module.Uuid
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/indexes.sql b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/indexes.sql
deleted file mode 100644
index 2ce63bc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/indexes.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-create index IX_94A7EF25 on Marketplace_App (category);
-create index IX_865B7BD5 on Marketplace_App (companyId);
-create index IX_20F14D93 on Marketplace_App (remoteAppId);
-create index IX_3E667FE1 on Marketplace_App (uuid_);
-create index IX_A7807DA7 on Marketplace_App (uuid_, companyId);
-
-create index IX_7DC16D26 on Marketplace_Module (appId);
-create index IX_C6938724 on Marketplace_Module (appId, contextName);
-create index IX_F2F1E964 on Marketplace_Module (contextName);
-create index IX_A7EFD80E on Marketplace_Module (uuid_);
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/sequences.sql b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/sequences.sql
deleted file mode 100644
index e69de29..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/sequences.sql
+++ /dev/null
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/tables.sql b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/tables.sql
deleted file mode 100644
index 2f92d47..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/sql/tables.sql
+++ /dev/null
@@ -1,22 +0,0 @@
-create table Marketplace_App (
-	uuid_ VARCHAR(75) null,
-	appId LONG not null primary key,
-	companyId LONG,
-	userId LONG,
-	userName VARCHAR(75) null,
-	createDate DATE null,
-	modifiedDate DATE null,
-	remoteAppId LONG,
-	title VARCHAR(75) null,
-	description STRING null,
-	category VARCHAR(75) null,
-	iconURL STRING null,
-	version VARCHAR(75) null
-);
-
-create table Marketplace_Module (
-	uuid_ VARCHAR(75) null,
-	moduleId LONG not null primary key,
-	appId LONG,
-	contextName VARCHAR(75) null
-);
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/base-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/base-spring.xml
deleted file mode 100644
index 8e5edba..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/base-spring.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	xmlns="http://www.springframework.org/schema/beans"
-	xmlns:aop="http://www.springframework.org/schema/aop"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
->
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.aop.ServiceBeanAutoProxyCreator" />
-		<constructor-arg>
-			<map>
-				<entry key="beanMatcher">
-					<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-						<constructor-arg value="com.liferay.portal.spring.aop.ServiceBeanMatcher" />
-					</bean>
-				</entry>
-				<entry key="methodInterceptor" value-ref="serviceAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.bean.BeanReferenceAnnotationBeanPostProcessor" />
-	</bean>
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.context.PortletBeanFactoryCleaner" />
-	</bean>
-	<bean id="portletClassLoader" class="com.liferay.portal.kernel.portlet.PortletClassLoaderUtil" factory-method="getClassLoader" />
-	<bean id="servletContextName" class="com.liferay.portal.kernel.portlet.PortletClassLoaderUtil" factory-method="getServletContextName" />
-	<bean id="basePersistence" abstract="true">
-		<property name="dataSource" ref="liferayDataSource" />
-		<property name="sessionFactory" ref="liferaySessionFactory" />
-	</bean>
-	<bean id="serviceAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.aop.SkipAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="accessControlAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="accessControlAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.security.ac.AccessControlAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="accessControlAdvisor">
-					<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-						<constructor-arg value="com.liferay.portal.security.ac.AccessControlAdvisorImpl" />
-					</bean>
-				</entry>
-				<entry key="nextMethodInterceptor" value-ref="portalResiliencyAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="portalResiliencyAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.resiliency.service.PortalResiliencyAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="serviceMonitorAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="serviceMonitorAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.monitoring.statistics.service.ServiceMonitorAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="asyncAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="asyncAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.messaging.async.AsyncAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="defaultDestinationName" value="liferay/async_service" />
-				<entry key="nextMethodInterceptor" value-ref="threadLocalCacheAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="threadLocalCacheAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.cache.ThreadLocalCacheAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="bufferedIncrementAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="bufferedIncrementAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.increment.BufferedIncrementAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="indexableAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="indexableAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.search.IndexableAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="systemEventAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="systemEventAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.systemevent.SystemEventAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="nextMethodInterceptor" value-ref="transactionAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="transactionAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.transaction.TransactionInterceptorFactoryBean" />
-		<constructor-arg>
-			<map>
-				<entry key="platformTransactionManager" value-ref="liferayTransactionManager" />
-				<entry key="transactionAttributeSource" value-ref="transactionAttributeSource" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="transactionAttributeSource" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.transaction.AnnotationTransactionAttributeSource" />
-	</bean>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/cluster-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/cluster-spring.xml
deleted file mode 100644
index cd5219b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/cluster-spring.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	xmlns="http://www.springframework.org/schema/beans"
-	xmlns:util="http://www.springframework.org/schema/util"
-	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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"
->
-	<bean class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.cluster.ClusterableChainableMethodAdviceInjector" />
-		<constructor-arg>
-			<map>
-				<entry key="parentChainableMethodAdvice" value-ref="serviceAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/hibernate-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/hibernate-spring.xml
deleted file mode 100644
index 27564a2..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/hibernate-spring.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	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="liferayHibernateSessionFactory" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.spring.hibernate.PortletHibernateConfiguration" />
-		<constructor-arg>
-			<map>
-				<entry key="dataSource" value-ref="liferayDataSource" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="liferaySessionFactory" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.dao.orm.hibernate.PortletSessionFactoryImpl" />
-		<constructor-arg>
-			<map>
-				<entry key="dataSource" value-ref="liferayDataSource" />
-				<entry key="sessionFactoryClassLoader" value-ref="portletClassLoader" />
-				<entry key="sessionFactoryImplementor" value-ref="liferayHibernateSessionFactory" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<bean id="liferayTransactionManager" class="com.liferay.portal.kernel.util.InfrastructureUtil" factory-method="getTransactionManager" />
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/infrastructure-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/infrastructure-spring.xml
deleted file mode 100644
index 380d697..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/infrastructure-spring.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	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="liferayDataSource" class="com.liferay.portal.kernel.util.InfrastructureUtil" factory-method="getDataSource" />
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/javadocs-all.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/javadocs-all.xml
deleted file mode 100644
index 7d84c2c..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/javadocs-all.xml
+++ /dev/null
@@ -1,1451 +0,0 @@
-<?xml version="1.0"?>
-
-<javadocs>
-	<javadoc>
-		<name>AppManagerControlPanelEntry</name>
-		<type>com.liferay.marketplace.appmanager.portlet.AppManagerControlPanelEntry</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>hasAccessPermission</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>group</name>
-				<type>com.liferay.portal.model.Group</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>portlet</name>
-				<type>com.liferay.portal.model.Portlet</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>AppManagerPortlet</name>
-		<type>com.liferay.marketplace.appmanager.portlet.AppManagerPortlet</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updatePluginSetting</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updatePluginSettings</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>doInstallRemoteApp</name>
-			<param>
-				<name>url</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>uploadPortletRequest</name>
-				<type>com.liferay.portal.kernel.upload.UploadPortletRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>failOnError</name>
-				<type>boolean</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>doInstallSourceForgeApp</name>
-			<param>
-				<name>path</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>uploadPortletRequest</name>
-				<type>com.liferay.portal.kernel.upload.UploadPortletRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>DEPLOY_TO_PREFIX</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>StartupAction</name>
-		<type>com.liferay.marketplace.hook.events.StartupAction</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>run</name>
-			<param>
-				<name>ids</name>
-				<type>java.lang.String[]</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>ActionException</name>
-				<type>com.liferay.portal.kernel.events.ActionException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>doRun</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>UpgradeProcess_1_0_0</name>
-		<type>com.liferay.marketplace.hook.upgrade.UpgradeProcess_1_0_0</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>getThreshold</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>doUpgrade</name>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>UpgradeExpando</name>
-		<type>com.liferay.marketplace.hook.upgrade.v1_0_0.UpgradeExpando</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>doUpgrade</name>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateMPExpandoColumns</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>HotDeployMessageListener</name>
-		<type>com.liferay.marketplace.messaging.HotDeployMessageListener</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>doReceive</name>
-			<param>
-				<name>message</name>
-				<type>com.liferay.portal.kernel.messaging.Message</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>MarketplaceMessageListener</name>
-		<type>com.liferay.marketplace.messaging.MarketplaceMessageListener</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>doReceive</name>
-			<param>
-				<name>message</name>
-				<type>com.liferay.portal.kernel.messaging.Message</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>AppImpl</name>
-		<type>com.liferay.marketplace.model.impl.AppImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>AppImpl</name>
-		</method>
-		<method>
-			<name>addContextName</name>
-			<param>
-				<name>contextName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getContextNames</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getFileDir</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getFileName</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getFilePath</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>isDownloaded</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>isInstalled</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>_DIR_NAME</name>
-		</field>
-		<field>
-			<name>_EXTENSION</name>
-		</field>
-		<field>
-			<name>_contextNames</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>ModuleImpl</name>
-		<type>com.liferay.marketplace.model.impl.ModuleImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>ModuleImpl</name>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>AppLocalServiceImpl</name>
-		<type>com.liferay.marketplace.service.impl.AppLocalServiceImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>clearInstalledAppsCache</name>
-		</method>
-		<method>
-			<name>deleteApp</name>
-			<param>
-				<name>app</name>
-				<type>com.liferay.marketplace.model.App</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>deleteApp</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>fetchRemoteApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getApps</name>
-			<param>
-				<name>category</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getBundledApps</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getInstalledApps</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>processMarketplaceProperties</name>
-			<param>
-				<name>properties</name>
-				<type>java.util.Properties</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>file</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>title</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>description</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>category</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>iconURL</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>file</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getContextName</name>
-			<param>
-				<name>fileName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getMarketplaceProperties</name>
-			<param>
-				<name>liferayPackageFile</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>hasDependentApp</name>
-			<param>
-				<name>module</name>
-				<type>com.liferay.marketplace.model.Module</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>validate</name>
-			<param>
-				<name>title</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>_log</name>
-		</field>
-		<field>
-			<name>_bundledApps</name>
-		</field>
-		<field>
-			<name>_installedApps</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>AppServiceImpl</name>
-		<type>com.liferay.marketplace.service.impl.AppServiceImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>deleteApp</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>version</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>file</name>
-				<type>java.io.File</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>ModuleLocalServiceImpl</name>
-		<type>com.liferay.marketplace.service.impl.ModuleLocalServiceImpl</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>addModule</name>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>contextName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>fetchModule</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>contextName</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getModules</name>
-			<param>
-				<name>appId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>MarketplacePermission</name>
-		<type>com.liferay.marketplace.service.permission.MarketplacePermission</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>check</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>contains</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>StoreControlPanelEntry</name>
-		<type>com.liferay.marketplace.store.portlet.StoreControlPanelEntry</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>hasAccessPermission</name>
-			<param>
-				<name>permissionChecker</name>
-				<type>com.liferay.portal.security.permission.PermissionChecker</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>group</name>
-				<type>com.liferay.portal.model.Group</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>portlet</name>
-				<type>com.liferay.portal.model.Portlet</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>StorePortlet</name>
-		<type>com.liferay.marketplace.store.portlet.StorePortlet</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>downloadApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getBundledApps</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getClientId</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>installApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>processAction</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>IOException</name>
-				<type>java.io.IOException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>uninstallApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateApp</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>updateClientId</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>callActionMethod</name>
-			<param>
-				<name>actionRequest</name>
-				<type>javax.portlet.ActionRequest</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>actionResponse</name>
-				<type>javax.portlet.ActionResponse</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortletException</name>
-				<type>javax.portlet.PortletException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getAppJSONObject</name>
-			<param>
-				<name>remoteAppId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>getRemoteAppPackageURL</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>token</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>url</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>Exception</name>
-				<type>java.lang.Exception</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<field>
-			<name>_PORTLET_NAMESPACE</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>MarketplaceConstants</name>
-		<type>com.liferay.marketplace.util.MarketplaceConstants</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>getPathPurchased</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getPathStore</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<field>
-			<name>MARKETPLACE_URL_LOGOUT</name>
-		</field>
-		<field>
-			<name>_MARKETPLACE_CLIENT_BUILD</name>
-		</field>
-		<field>
-			<name>_MARKETPLACE_PATH_PURCHASED</name>
-		</field>
-		<field>
-			<name>_MARKETPLACE_PATH_STORE</name>
-		</field>
-		<field>
-			<name>_pathPurchased</name>
-		</field>
-		<field>
-			<name>_pathStore</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>MarketplaceUtil</name>
-		<type>com.liferay.marketplace.util.MarketplaceUtil</type>
-		<author><![CDATA[Peter Shin]]></author>
-		<method>
-			<name>decodeClientId</name>
-			<param>
-				<name>encodedClientId</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>token</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>encodeClientId</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>userId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>token</name>
-				<type>java.lang.String</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>hasMarketplaceAdmin</name>
-			<param>
-				<name>companyId</name>
-				<type>long</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>isMarketplaceAdmin</name>
-			<param>
-				<name>user</name>
-				<type>com.liferay.portal.model.User</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-			<throws>
-				<name>PortalException</name>
-				<type>com.liferay.portal.kernel.exception.PortalException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-			<throws>
-				<name>SystemException</name>
-				<type>com.liferay.portal.kernel.exception.SystemException</type>
-				<comment><![CDATA[]]></comment>
-			</throws>
-		</method>
-		<method>
-			<name>xor</name>
-			<param>
-				<name>bytes1</name>
-				<type>byte[]</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>bytes2</name>
-				<type>byte[]</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-	</javadoc>
-	<javadoc>
-		<name>PortletKeys</name>
-		<type>com.liferay.marketplace.util.PortletKeys</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<field>
-			<name>MY_MARKETPLACE</name>
-		</field>
-		<field>
-			<name>STORE</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>PortletPropsKeys</name>
-		<type>com.liferay.marketplace.util.PortletPropsKeys</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<field>
-			<name>MARKETPLACE_STORE_ENABLED</name>
-		</field>
-		<field>
-			<name>MARKETPLACE_URL_LOGOUT</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>PortletPropsValues</name>
-		<type>com.liferay.marketplace.util.PortletPropsValues</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<field>
-			<name>MARKETPLACE_STORE_ENABLED</name>
-		</field>
-		<field>
-			<name>MARKETPLACE_URL_LOGOUT</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>AppTitleComparator</name>
-		<type>com.liferay.marketplace.util.comparator.AppTitleComparator</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>AppTitleComparator</name>
-		</method>
-		<method>
-			<name>AppTitleComparator</name>
-			<param>
-				<name>asc</name>
-				<type>boolean</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-		</method>
-		<method>
-			<name>compare</name>
-			<param>
-				<name>obj1</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>obj2</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getOrderBy</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>getOrderByFields</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>isAscending</name>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<field>
-			<name>ORDER_BY_ASC</name>
-		</field>
-		<field>
-			<name>ORDER_BY_DESC</name>
-		</field>
-		<field>
-			<name>ORDER_BY_FIELDS</name>
-		</field>
-		<field>
-			<name>_asc</name>
-		</field>
-	</javadoc>
-	<javadoc>
-		<name>PluginComparator</name>
-		<type>com.liferay.marketplace.util.comparator.PluginComparator</type>
-		<author><![CDATA[Ryan Park]]></author>
-		<method>
-			<name>PluginComparator</name>
-		</method>
-		<method>
-			<name>PluginComparator</name>
-			<param>
-				<name>servletContext</name>
-				<type>javax.servlet.ServletContext</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>locale</name>
-				<type>java.util.Locale</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-		</method>
-		<method>
-			<name>compare</name>
-			<param>
-				<name>plugin1</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<param>
-				<name>plugin2</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<method>
-			<name>_getName</name>
-			<param>
-				<name>plugin</name>
-				<type>java.lang.Object</type>
-				<comment><![CDATA[]]></comment>
-			</param>
-			<return>
-				<comment><![CDATA[]]></comment>
-			</return>
-		</method>
-		<field>
-			<name>_locale</name>
-		</field>
-		<field>
-			<name>_servletContext</name>
-		</field>
-	</javadoc>
-</javadocs>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/javadocs-rt.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/javadocs-rt.xml
deleted file mode 100644
index 48342ae..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/javadocs-rt.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<javadocs><javadoc><name>AppLocalServiceImpl</name><type>com.liferay.marketplace.service.impl.AppLocalServiceImpl</type><author><![CDATA[Ryan Park]]></author><method><name>clearInstalledAppsCache</name></method><method><name>deleteApp</name><param><name>app</name><type>com.liferay.marketplace.model.App</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>deleteApp</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>fetchRemoteApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getApps</name><param><name>category</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getBundledApps</name><return><comment><![CDATA[]]></comment></return></method><method><name>getInstalledApps</name><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>installApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>processMarketplaceProperties</name><param><name>properties</name><type>java.util.Properties</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>uninstallApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>updateApp</name><param><name>userId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>file</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>updateApp</name><param><name>userId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>title</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>description</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>category</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>iconURL</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>file</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getContextName</name><param><name>fileName</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return></method><method><name>getMarketplaceProperties</name><param><name>liferayPackageFile</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return></method><method><name>hasDependentApp</name><param><name>module</name><type>com.liferay.marketplace.model.Module</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>validate</name><param><name>title</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><field><name>_log</name></field><field><name>_bundledApps</name></field><field><name>_installedApps</name></field></javadoc><javadoc><name>AppServiceImpl</name><type>com.liferay.marketplace.service.impl.AppServiceImpl</type><author><![CDATA[Ryan Park]]></author><method><name>deleteApp</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>installApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>uninstallApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>updateApp</name><param><name>remoteAppId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>version</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><param><name>file</name><type>java.io.File</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>PortalException</name><type>com.liferay.portal.kernel.exception.PortalException</type><comment><![CDATA[]]></comment></throws><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method></javadoc><javadoc><name>ModuleLocalServiceImpl</name><type>com.liferay.marketplace.service.impl.ModuleLocalServiceImpl</type><author><![CDATA[Ryan Park]]></author><method><name>addModule</name><param><name>userId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>contextName</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>fetchModule</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><param><name>contextName</name><type>java.lang.String</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method><method><name>getModules</name><param><name>appId</name><type>long</type><comment><![CDATA[]]></comment></param><return><comment><![CDATA[]]></comment></return><throws><name>SystemException</name><type>com.liferay.portal.kernel.exception.SystemException</type><comment><![CDATA[]]></comment></throws></method></javadoc></javadocs>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/messaging-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/messaging-spring.xml
deleted file mode 100644
index cfc66a5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/messaging-spring.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	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"
->
-
-	<!-- Listeners -->
-
-	<bean id="messageListener.hot_deploy" class="com.liferay.marketplace.messaging.HotDeployMessageListener" />
-	<bean id="messageListener.marketplace" class="com.liferay.marketplace.messaging.MarketplaceMessageListener" />
-
-	<!-- Configurator -->
-
-	<bean id="messagingConfigurator" class="com.liferay.portal.kernel.messaging.config.PluginMessagingConfigurator">
-		<property name="messageListeners">
-			<map key-type="java.lang.String" value-type="java.util.List">
-				<entry key="liferay/hot_deploy">
-					<list value-type="com.liferay.portal.kernel.messaging.MessageListener">
-						<ref bean="messageListener.hot_deploy" />
-					</list>
-				</entry>
-				<entry key="liferay/marketplace">
-					<list value-type="com.liferay.portal.kernel.messaging.MessageListener">
-						<ref bean="messageListener.marketplace" />
-					</list>
-				</entry>
-			</map>
-		</property>
-	</bean>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-hbm.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-hbm.xml
deleted file mode 100644
index cea6660..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-hbm.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping default-lazy="false" auto-import="false">
-	<import class="com.liferay.marketplace.model.App" />
-	<import class="com.liferay.marketplace.model.Module" />
-	<class name="com.liferay.marketplace.model.impl.AppImpl" table="Marketplace_App">
-		<cache usage="read-write" />
-		<id name="appId" type="long">
-			<generator class="assigned" />
-		</id>
-		<property name="uuid" type="com.liferay.portal.dao.orm.hibernate.StringType" column="uuid_" />
-		<property name="companyId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="userId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="userName" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="createDate" type="org.hibernate.type.TimestampType" />
-		<property name="modifiedDate" type="org.hibernate.type.TimestampType" />
-		<property name="remoteAppId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="title" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="description" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="category" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="iconURL" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-		<property name="version" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-	</class>
-	<class name="com.liferay.marketplace.model.impl.ModuleImpl" table="Marketplace_Module">
-		<cache usage="read-write" />
-		<id name="moduleId" type="long">
-			<generator class="assigned" />
-		</id>
-		<property name="uuid" type="com.liferay.portal.dao.orm.hibernate.StringType" column="uuid_" />
-		<property name="appId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
-		<property name="contextName" type="com.liferay.portal.dao.orm.hibernate.StringType" />
-	</class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-model-hints.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-model-hints.xml
deleted file mode 100644
index 270df20..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-model-hints.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-
-<model-hints>
-	<model name="com.liferay.marketplace.model.App">
-		<field name="uuid" type="String" />
-		<field name="appId" type="long" />
-		<field name="companyId" type="long" />
-		<field name="userId" type="long" />
-		<field name="userName" type="String" />
-		<field name="createDate" type="Date" />
-		<field name="modifiedDate" type="Date" />
-		<field name="remoteAppId" type="long" />
-		<field name="title" type="String" />
-		<field name="description" type="String">
-			<hint-collection name="TEXTAREA" />
-		</field>
-		<field name="category" type="String" />
-		<field name="iconURL" type="String">
-			<hint-collection name="URL" />
-		</field>
-		<field name="version" type="String" />
-	</model>
-	<model name="com.liferay.marketplace.model.Module">
-		<field name="uuid" type="String" />
-		<field name="moduleId" type="long" />
-		<field name="appId" type="long" />
-		<field name="contextName" type="String" />
-	</model>
-</model-hints>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-orm.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-orm.xml
deleted file mode 100644
index d321672..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-orm.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-
-<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
-	<persistence-unit-metadata>
-		<xml-mapping-metadata-complete/>
-		<persistence-unit-defaults>
-			<access>PROPERTY</access>
-		</persistence-unit-defaults>
-	</persistence-unit-metadata>
-	<mapped-superclass class="com.liferay.marketplace.model.impl.AppModelImpl">
-		<attributes>
-			<id name="appId" />
-			<basic name="uuid">
-				<column name="UUID_" />
-			</basic>
-			<basic name="companyId" />
-			<basic name="userId" />
-			<basic name="userName" />
-			<basic name="createDate">
-				<temporal>TIMESTAMP</temporal>
-			</basic>
-			<basic name="modifiedDate">
-				<temporal>TIMESTAMP</temporal>
-			</basic>
-			<basic name="remoteAppId" />
-			<basic name="title" />
-			<basic name="description" />
-			<basic name="category" />
-			<basic name="iconURL" />
-			<basic name="version" />
-			<transient name="modelAttributes" />
-			<transient name="primaryKey" />
-			<transient name="primaryKeyObj" />
-			<transient name="userUuid" />
-		</attributes>
-	</mapped-superclass>
-	<mapped-superclass class="com.liferay.marketplace.model.impl.ModuleModelImpl">
-		<attributes>
-			<id name="moduleId" />
-			<basic name="uuid">
-				<column name="UUID_" />
-			</basic>
-			<basic name="appId" />
-			<basic name="contextName" />
-			<transient name="modelAttributes" />
-			<transient name="primaryKey" />
-			<transient name="primaryKeyObj" />
-		</attributes>
-	</mapped-superclass>
-	<entity class="com.liferay.marketplace.model.impl.AppImpl" name="App">
-		<table name="Marketplace_App" />
-		<attributes />
-	</entity>
-	<entity class="com.liferay.marketplace.model.impl.ModuleImpl" name="Module">
-		<table name="Marketplace_Module" />
-		<attributes />
-	</entity>
-</entity-mappings>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-spring.xml
deleted file mode 100644
index bee5c19..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/portlet-spring.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-
-<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" default-destroy-method="destroy" default-init-method="afterPropertiesSet" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-	<bean id="com.liferay.marketplace.service.AppLocalService" class="com.liferay.marketplace.service.impl.AppLocalServiceImpl" />
-	<bean id="com.liferay.marketplace.service.AppService" class="com.liferay.marketplace.service.impl.AppServiceImpl" />
-	<bean id="com.liferay.marketplace.service.persistence.AppPersistence" class="com.liferay.marketplace.service.persistence.AppPersistenceImpl" parent="basePersistence" />
-	<bean id="com.liferay.marketplace.service.ModuleLocalService" class="com.liferay.marketplace.service.impl.ModuleLocalServiceImpl" />
-	<bean id="com.liferay.marketplace.service.persistence.ModulePersistence" class="com.liferay.marketplace.service.persistence.ModulePersistenceImpl" parent="basePersistence" />
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/shard-data-source-spring.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/shard-data-source-spring.xml
deleted file mode 100644
index fe293f4..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/META-INF/shard-data-source-spring.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-
-<beans
-	default-destroy-method="destroy"
-	default-init-method="afterPropertiesSet"
-	xmlns="http://www.springframework.org/schema/beans"
-	xmlns:aop="http://www.springframework.org/schema/aop"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
->
-	<bean id="com.liferay.portal.dao.shard.advice.ShardAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.dao.shard.advice.ShardAdvice" />
-	</bean>
-	<bean id="com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice" class="com.liferay.portal.kernel.spring.util.SpringFactoryUtil" factory-method="newBean">
-		<constructor-arg value="com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice" />
-		<constructor-arg>
-			<map>
-				<entry key="shardAdvice" value-ref="com.liferay.portal.dao.shard.advice.ShardAdvice" />
-			</map>
-		</constructor-arg>
-	</bean>
-	<aop:config proxy-target-class="false">
-		<aop:advisor advice-ref="com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice" pointcut="bean(*Persistence) || bean(*Finder)" />
-	</aop:config>
-</beans>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/appmanager/portlet/AppManagerControlPanelEntry.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/appmanager/portlet/AppManagerControlPanelEntry.java
deleted file mode 100644
index 2d56247..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/appmanager/portlet/AppManagerControlPanelEntry.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.appmanager.portlet;
-
-import com.liferay.portal.model.Group;
-import com.liferay.portal.model.Portlet;
-import com.liferay.portal.security.permission.PermissionChecker;
-import com.liferay.portlet.BaseControlPanelEntry;
-
-/**
- * @author Ryan Park
- */
-public class AppManagerControlPanelEntry extends BaseControlPanelEntry {
-
-	@Override
-	public boolean hasAccessPermission(
-			PermissionChecker permissionChecker, Group group, Portlet portlet)
-		throws Exception {
-
-		return permissionChecker.isOmniadmin();
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/appmanager/portlet/AppManagerPortlet.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/appmanager/portlet/AppManagerPortlet.java
deleted file mode 100644
index 1833135..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/appmanager/portlet/AppManagerPortlet.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.appmanager.portlet;
-
-import com.liferay.marketplace.service.AppServiceUtil;
-import com.liferay.portal.kernel.deploy.DeployManagerUtil;
-import com.liferay.portal.kernel.servlet.ServletContextPool;
-import com.liferay.portal.kernel.servlet.SessionErrors;
-import com.liferay.portal.kernel.servlet.SessionMessages;
-import com.liferay.portal.kernel.upload.UploadException;
-import com.liferay.portal.kernel.upload.UploadPortletRequest;
-import com.liferay.portal.kernel.util.ArrayUtil;
-import com.liferay.portal.kernel.util.CharPool;
-import com.liferay.portal.kernel.util.Constants;
-import com.liferay.portal.kernel.util.FileUtil;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.Http;
-import com.liferay.portal.kernel.util.HttpUtil;
-import com.liferay.portal.kernel.util.ParamUtil;
-import com.liferay.portal.kernel.util.PrefsPropsUtil;
-import com.liferay.portal.kernel.util.PropsKeys;
-import com.liferay.portal.kernel.util.PropsUtil;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.StringUtil;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.kernel.util.WebKeys;
-import com.liferay.portal.model.LayoutTemplate;
-import com.liferay.portal.model.Plugin;
-import com.liferay.portal.model.PluginSetting;
-import com.liferay.portal.model.Portlet;
-import com.liferay.portal.model.Theme;
-import com.liferay.portal.service.PluginSettingLocalServiceUtil;
-import com.liferay.portal.service.PluginSettingServiceUtil;
-import com.liferay.portal.service.PortletServiceUtil;
-import com.liferay.portal.theme.ThemeDisplay;
-import com.liferay.portal.util.PortalUtil;
-import com.liferay.util.bridges.mvc.MVCPortlet;
-
-import java.io.File;
-import java.io.IOException;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Ryan Park
- */
-public class AppManagerPortlet extends MVCPortlet {
-
-	public void installApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		UploadPortletRequest uploadPortletRequest =
-			PortalUtil.getUploadPortletRequest(actionRequest);
-
-		String installMethod = ParamUtil.getString(
-			uploadPortletRequest, "installMethod");
-
-		if (installMethod.equals("local")) {
-			String fileName = GetterUtil.getString(
-				uploadPortletRequest.getFileName("file"));
-
-			File file = uploadPortletRequest.getFile("file");
-
-			byte[] bytes = FileUtil.getBytes(file);
-
-			if (ArrayUtil.isEmpty(bytes)) {
-				SessionErrors.add(
-					actionRequest, UploadException.class.getName());
-			}
-			else {
-				String deployDir = PrefsPropsUtil.getString(
-					PropsKeys.AUTO_DEPLOY_DEPLOY_DIR);
-
-				FileUtil.copyFile(
-					file.toString(), deployDir + StringPool.SLASH + fileName);
-
-				SessionMessages.add(actionRequest, "pluginUploaded");
-			}
-		}
-		else {
-			try {
-				String url = ParamUtil.getString(uploadPortletRequest, "url");
-
-				URL urlObj = new URL(url);
-
-				String host = urlObj.getHost();
-
-				if (host.endsWith("sf.net") ||
-					host.endsWith("sourceforge.net")) {
-
-					doInstallSourceForgeApp(
-						urlObj.getPath(), uploadPortletRequest, actionRequest);
-				}
-				else {
-					doInstallRemoteApp(
-						url, uploadPortletRequest, actionRequest, true);
-				}
-			}
-			catch (MalformedURLException murle) {
-				SessionErrors.add(actionRequest, "invalidUrl", murle);
-			}
-		}
-
-		String redirect = ParamUtil.getString(uploadPortletRequest, "redirect");
-
-		actionResponse.sendRedirect(redirect);
-	}
-
-	public void uninstallApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		long remoteAppId = ParamUtil.getLong(actionRequest, "remoteAppId");
-
-		if (remoteAppId > 0) {
-			AppServiceUtil.uninstallApp(remoteAppId);
-		}
-		else {
-			String[] contextNames = StringUtil.split(
-				ParamUtil.getString(actionRequest, "contextNames"));
-
-			for (String contextName : contextNames) {
-				DeployManagerUtil.undeploy(contextName);
-			}
-		}
-
-		SessionMessages.add(actionRequest, "triggeredPortletUndeploy");
-	}
-
-	public void updatePluginSetting(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
-			WebKeys.THEME_DISPLAY);
-
-		String pluginId = ParamUtil.getString(actionRequest, "pluginId");
-		String pluginType = ParamUtil.getString(actionRequest, "pluginType");
-
-		String[] roles = StringUtil.split(
-			ParamUtil.getString(actionRequest, "roles"), CharPool.NEW_LINE);
-
-		Arrays.sort(roles);
-
-		boolean active = ParamUtil.getBoolean(actionRequest, "active");
-
-		if (pluginType.equals(Plugin.TYPE_PORTLET)) {
-			PortletServiceUtil.updatePortlet(
-				themeDisplay.getCompanyId(), pluginId, StringPool.BLANK,
-				active);
-		}
-		else {
-			if (roles.length == 0) {
-				PluginSetting pluginSetting =
-					PluginSettingLocalServiceUtil.getPluginSetting(
-						themeDisplay.getCompanyId(), pluginId, pluginType);
-
-				roles = StringUtil.split(pluginSetting.getRoles());
-			}
-
-			PluginSettingServiceUtil.updatePluginSetting(
-				themeDisplay.getCompanyId(), pluginId, pluginType,
-				StringUtil.merge(roles), active);
-		}
-	}
-
-	public void updatePluginSettings(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
-			WebKeys.THEME_DISPLAY);
-
-		String[] contextNames = StringUtil.split(
-			ParamUtil.getString(actionRequest, "contextNames"));
-
-		boolean active = ParamUtil.getBoolean(actionRequest, "active");
-
-		for (String contextName : contextNames) {
-			ServletContext servletContext = ServletContextPool.get(contextName);
-
-			List<LayoutTemplate> layoutTemplates =
-				(List<LayoutTemplate>)servletContext.getAttribute(
-					WebKeys.PLUGIN_LAYOUT_TEMPLATES);
-
-			if (layoutTemplates != null) {
-				for (LayoutTemplate layoutTemplate : layoutTemplates) {
-					PluginSetting pluginSetting =
-						PluginSettingLocalServiceUtil.getPluginSetting(
-							themeDisplay.getCompanyId(),
-							layoutTemplate.getLayoutTemplateId(),
-							Plugin.TYPE_LAYOUT_TEMPLATE);
-
-					PluginSettingServiceUtil.updatePluginSetting(
-						themeDisplay.getCompanyId(),
-						layoutTemplate.getLayoutTemplateId(),
-						Plugin.TYPE_LAYOUT_TEMPLATE, pluginSetting.getRoles(),
-						active);
-				}
-			}
-
-			List<Portlet> portlets = (List<Portlet>)servletContext.getAttribute(
-				WebKeys.PLUGIN_PORTLETS);
-
-			if (portlets != null) {
-				for (Portlet portlet : portlets) {
-					PortletServiceUtil.updatePortlet(
-						themeDisplay.getCompanyId(), portlet.getPortletId(),
-						StringPool.BLANK, active);
-				}
-			}
-
-			List<Theme> themes = (List<Theme>)servletContext.getAttribute(
-				WebKeys.PLUGIN_THEMES);
-
-			if (themes != null) {
-				for (Theme theme : themes) {
-					PluginSetting pluginSetting =
-						PluginSettingLocalServiceUtil.getPluginSetting(
-							themeDisplay.getCompanyId(), theme.getThemeId(),
-							Plugin.TYPE_THEME);
-
-					PluginSettingServiceUtil.updatePluginSetting(
-						themeDisplay.getCompanyId(), theme.getThemeId(),
-						Plugin.TYPE_THEME, pluginSetting.getRoles(), active);
-				}
-			}
-		}
-	}
-
-	protected int doInstallRemoteApp(
-			String url, UploadPortletRequest uploadPortletRequest,
-			ActionRequest actionRequest, boolean failOnError)
-		throws Exception {
-
-		int responseCode = HttpServletResponse.SC_OK;
-
-		String deploymentContext = ParamUtil.getString(
-			uploadPortletRequest, "deploymentContext");
-
-		try {
-			String fileName = null;
-
-			if (Validator.isNotNull(deploymentContext)) {
-				fileName = DEPLOY_TO_PREFIX + deploymentContext + ".war";
-			}
-			else {
-				fileName = url.substring(url.lastIndexOf(CharPool.SLASH) + 1);
-
-				int pos = fileName.lastIndexOf(CharPool.PERIOD);
-
-				if (pos != -1) {
-					deploymentContext = fileName.substring(0, pos);
-				}
-			}
-
-			Http.Options options = new Http.Options();
-
-			options.setFollowRedirects(false);
-			options.setLocation(url);
-			options.setPortletRequest(actionRequest);
-			options.setPost(false);
-
-			String progressId = ParamUtil.getString(
-				uploadPortletRequest, Constants.PROGRESS_ID);
-
-			options.setProgressId(progressId);
-
-			byte[] bytes = HttpUtil.URLtoByteArray(options);
-
-			Http.Response response = options.getResponse();
-
-			responseCode = response.getResponseCode();
-
-			if ((responseCode == HttpServletResponse.SC_OK) &&
-				(bytes.length > 0)) {
-
-				String deployDir = PrefsPropsUtil.getString(
-					PropsKeys.AUTO_DEPLOY_DEPLOY_DIR);
-
-				String destination = deployDir + StringPool.SLASH + fileName;
-
-				File destinationFile = new File(destination);
-
-				FileUtil.write(destinationFile, bytes);
-
-				SessionMessages.add(actionRequest, "pluginDownloaded");
-			}
-			else {
-				if (failOnError) {
-					SessionErrors.add(
-						actionRequest, UploadException.class.getName());
-				}
-
-				responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-			}
-		}
-		catch (MalformedURLException murle) {
-			SessionErrors.add(actionRequest, "invalidUrl", murle);
-		}
-		catch (IOException ioe) {
-			SessionErrors.add(actionRequest, "errorConnectingToUrl", ioe);
-		}
-
-		return responseCode;
-	}
-
-	protected void doInstallSourceForgeApp(
-			String path, UploadPortletRequest uploadPortletRequest,
-			ActionRequest actionRequest)
-		throws Exception {
-
-		String[] sourceForgeMirrors = PropsUtil.getArray(
-			PropsKeys.SOURCE_FORGE_MIRRORS);
-
-		for (int i = 0; i < sourceForgeMirrors.length; i++) {
-			try {
-				String url = sourceForgeMirrors[i] + path;
-
-				boolean failOnError = false;
-
-				if ((i + 1) == sourceForgeMirrors.length) {
-					failOnError = true;
-				}
-
-				int responseCode = doInstallRemoteApp(
-					url, uploadPortletRequest, actionRequest, failOnError);
-
-				if (responseCode == HttpServletResponse.SC_OK) {
-					return;
-				}
-			}
-			catch (MalformedURLException murle) {
-				SessionErrors.add(actionRequest, "invalidUrl", murle);
-			}
-		}
-	}
-
-	private final String DEPLOY_TO_PREFIX = "DEPLOY_TO__";
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/events/StartupAction.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/events/StartupAction.java
deleted file mode 100644
index 5a6aba2..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/events/StartupAction.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.hook.events;
-
-import com.liferay.portal.kernel.events.ActionException;
-import com.liferay.portal.kernel.events.SimpleAction;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.model.User;
-import com.liferay.portlet.expando.DuplicateColumnNameException;
-import com.liferay.portlet.expando.DuplicateTableNameException;
-import com.liferay.portlet.expando.model.ExpandoColumnConstants;
-import com.liferay.portlet.expando.model.ExpandoTable;
-import com.liferay.portlet.expando.service.ExpandoColumnLocalServiceUtil;
-import com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil;
-
-/**
- * @author Peter Shin
- */
-public class StartupAction extends SimpleAction {
-
-	@Override
-	public void run(String[] ids) throws ActionException {
-		try {
-			doRun(GetterUtil.getLong(ids[0]));
-		}
-		catch (Exception e) {
-			throw new ActionException(e);
-		}
-	}
-
-	protected void doRun(long companyId) throws Exception {
-		ExpandoTable table = null;
-
-		try {
-			table = ExpandoTableLocalServiceUtil.addTable(
-				companyId, User.class.getName(), "MP");
-		}
-		catch (DuplicateTableNameException dtne) {
-			table = ExpandoTableLocalServiceUtil.getTable(
-				companyId, User.class.getName(), "MP");
-		}
-
-		try {
-			ExpandoColumnLocalServiceUtil.addColumn(
-				table.getTableId(), "clientId", ExpandoColumnConstants.STRING);
-		}
-		catch (DuplicateColumnNameException dcne) {
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/upgrade/UpgradeProcess_1_0_0.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/upgrade/UpgradeProcess_1_0_0.java
deleted file mode 100644
index 6bc4123..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/upgrade/UpgradeProcess_1_0_0.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.hook.upgrade;
-
-import com.liferay.marketplace.hook.upgrade.v1_0_0.UpgradeExpando;
-import com.liferay.portal.kernel.upgrade.UpgradeProcess;
-
-/**
- * @author Peter Shin
- */
-public class UpgradeProcess_1_0_0 extends UpgradeProcess {
-
-	@Override
-	public int getThreshold() {
-		return 100;
-	}
-
-	@Override
-	protected void doUpgrade() throws Exception {
-		upgrade(UpgradeExpando.class);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/upgrade/v1_0_0/UpgradeExpando.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/upgrade/v1_0_0/UpgradeExpando.java
deleted file mode 100644
index 0e7f907..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/hook/upgrade/v1_0_0/UpgradeExpando.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.hook.upgrade.v1_0_0;
-
-import com.liferay.portal.kernel.dao.orm.QueryUtil;
-import com.liferay.portal.kernel.upgrade.UpgradeProcess;
-import com.liferay.portal.model.User;
-import com.liferay.portal.util.PortalUtil;
-import com.liferay.portlet.expando.NoSuchTableException;
-import com.liferay.portlet.expando.model.ExpandoColumn;
-import com.liferay.portlet.expando.model.ExpandoColumnConstants;
-import com.liferay.portlet.expando.model.ExpandoTable;
-import com.liferay.portlet.expando.model.ExpandoValue;
-import com.liferay.portlet.expando.service.ExpandoColumnLocalServiceUtil;
-import com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil;
-import com.liferay.portlet.expando.service.ExpandoValueLocalServiceUtil;
-
-import java.util.List;
-
-/**
- * @author Peter Shin
- */
-public class UpgradeExpando extends UpgradeProcess {
-
-	@Override
-	protected void doUpgrade() throws Exception {
-		for (long companyId : PortalUtil.getCompanyIds()) {
-			updateMPExpandoColumns(companyId);
-		}
-	}
-
-	protected void updateMPExpandoColumns(long companyId) throws Exception {
-		ExpandoTable expandoTable = null;
-
-		try {
-			expandoTable = ExpandoTableLocalServiceUtil.getTable(
-				companyId, User.class.getName(), "MP");
-		}
-		catch (NoSuchTableException nste) {
-			return;
-		}
-
-		ExpandoColumn oldExpandoColumn =
-			ExpandoColumnLocalServiceUtil.getColumn(
-				companyId, User.class.getName(), expandoTable.getName(),
-				"client-id");
-
-		if (oldExpandoColumn == null) {
-			return;
-		}
-
-		ExpandoColumn newExpandoColumn =
-			ExpandoColumnLocalServiceUtil.getColumn(
-				companyId, User.class.getName(), expandoTable.getName(),
-				"clientId");
-
-		if (newExpandoColumn == null) {
-			newExpandoColumn = ExpandoColumnLocalServiceUtil.updateColumn(
-				oldExpandoColumn.getColumnId(), "clientId",
-				ExpandoColumnConstants.STRING);
-		}
-
-		List<ExpandoValue> expandoValues =
-			ExpandoValueLocalServiceUtil.getColumnValues(
-				oldExpandoColumn.getColumnId(), QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS);
-
-		for (ExpandoValue expandoValue : expandoValues) {
-			ExpandoValueLocalServiceUtil.addValue(
-				expandoValue.getCompanyId(), User.class.getName(),
-				expandoTable.getName(), newExpandoColumn.getName(),
-				expandoValue.getClassPK(), expandoValue.getString());
-		}
-
-		ExpandoColumnLocalServiceUtil.deleteColumn(
-			oldExpandoColumn.getColumnId());
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/messaging/HotDeployMessageListener.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/messaging/HotDeployMessageListener.java
deleted file mode 100644
index c6437ec..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/messaging/HotDeployMessageListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.messaging;
-
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-import com.liferay.portal.kernel.messaging.BaseMessageListener;
-import com.liferay.portal.kernel.messaging.Message;
-
-/**
- * @author Ryan Park
- */
-public class HotDeployMessageListener extends BaseMessageListener {
-
-	@Override
-	protected void doReceive(Message message) throws Exception {
-		AppLocalServiceUtil.clearInstalledAppsCache();
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/messaging/MarketplaceMessageListener.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/messaging/MarketplaceMessageListener.java
deleted file mode 100644
index aaec223..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/messaging/MarketplaceMessageListener.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.messaging;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-import com.liferay.portal.kernel.messaging.BaseMessageListener;
-import com.liferay.portal.kernel.messaging.Message;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.PropertiesUtil;
-import com.liferay.portal.kernel.util.StringUtil;
-import com.liferay.portal.kernel.util.Validator;
-
-import java.util.Properties;
-
-/**
- * @author Ryan Park
- */
-public class MarketplaceMessageListener extends BaseMessageListener {
-
-	@Override
-	protected void doReceive(Message message) throws Exception {
-		String command = message.getString("command");
-
-		if (!command.equals("deploy")) {
-			return;
-		}
-
-		Properties properties = PropertiesUtil.load(
-			message.getString("properties"));
-
-		long remoteAppId = GetterUtil.getLong(
-			properties.getProperty("remote-app-id"));
-		String version = properties.getProperty("version");
-
-		if ((remoteAppId <= 0) || Validator.isNull(version)) {
-			return;
-		}
-
-		String title = properties.getProperty("title");
-		String description = properties.getProperty("description");
-		String category = properties.getProperty("category");
-		String iconURL = properties.getProperty("icon-url");
-
-		App app = AppLocalServiceUtil.updateApp(
-			0, remoteAppId, title, description, category, iconURL, version,
-			null);
-
-		String[] contextNames = StringUtil.split(
-			properties.getProperty("context-names"));
-
-		for (String contextName : contextNames) {
-			ModuleLocalServiceUtil.addModule(0, app.getAppId(), contextName);
-		}
-
-		AppLocalServiceUtil.processMarketplaceProperties(properties);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppBaseImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppBaseImpl.java
deleted file mode 100644
index 619e60f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppBaseImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-
-import com.liferay.portal.kernel.exception.SystemException;
-
-/**
- * The extended model base implementation for the App service. Represents a row in the &quot;Marketplace_App&quot; database table, with each column mapped to a property of this class.
- *
- * <p>
- * This class exists only as a container for the default extended model level methods generated by ServiceBuilder. Helper methods and all application logic should be put in {@link AppImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see AppImpl
- * @see com.liferay.marketplace.model.App
- * @generated
- */
-public abstract class AppBaseImpl extends AppModelImpl implements App {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. All methods that expect a app model instance should use the {@link App} interface instead.
-	 */
-	@Override
-	public void persist() throws SystemException {
-		if (this.isNew()) {
-			AppLocalServiceUtil.addApp(this);
-		}
-		else {
-			AppLocalServiceUtil.updateApp(this);
-		}
-	}
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppCacheModel.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppCacheModel.java
deleted file mode 100644
index 1d7cc74..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppCacheModel.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.App;
-
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.model.CacheModel;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-
-import java.util.Date;
-
-/**
- * The cache model class for representing App in entity cache.
- *
- * @author Ryan Park
- * @see App
- * @generated
- */
-public class AppCacheModel implements CacheModel<App>, Externalizable {
-	@Override
-	public String toString() {
-		StringBundler sb = new StringBundler(27);
-
-		sb.append("{uuid=");
-		sb.append(uuid);
-		sb.append(", appId=");
-		sb.append(appId);
-		sb.append(", companyId=");
-		sb.append(companyId);
-		sb.append(", userId=");
-		sb.append(userId);
-		sb.append(", userName=");
-		sb.append(userName);
-		sb.append(", createDate=");
-		sb.append(createDate);
-		sb.append(", modifiedDate=");
-		sb.append(modifiedDate);
-		sb.append(", remoteAppId=");
-		sb.append(remoteAppId);
-		sb.append(", title=");
-		sb.append(title);
-		sb.append(", description=");
-		sb.append(description);
-		sb.append(", category=");
-		sb.append(category);
-		sb.append(", iconURL=");
-		sb.append(iconURL);
-		sb.append(", version=");
-		sb.append(version);
-		sb.append("}");
-
-		return sb.toString();
-	}
-
-	@Override
-	public App toEntityModel() {
-		AppImpl appImpl = new AppImpl();
-
-		if (uuid == null) {
-			appImpl.setUuid(StringPool.BLANK);
-		}
-		else {
-			appImpl.setUuid(uuid);
-		}
-
-		appImpl.setAppId(appId);
-		appImpl.setCompanyId(companyId);
-		appImpl.setUserId(userId);
-
-		if (userName == null) {
-			appImpl.setUserName(StringPool.BLANK);
-		}
-		else {
-			appImpl.setUserName(userName);
-		}
-
-		if (createDate == Long.MIN_VALUE) {
-			appImpl.setCreateDate(null);
-		}
-		else {
-			appImpl.setCreateDate(new Date(createDate));
-		}
-
-		if (modifiedDate == Long.MIN_VALUE) {
-			appImpl.setModifiedDate(null);
-		}
-		else {
-			appImpl.setModifiedDate(new Date(modifiedDate));
-		}
-
-		appImpl.setRemoteAppId(remoteAppId);
-
-		if (title == null) {
-			appImpl.setTitle(StringPool.BLANK);
-		}
-		else {
-			appImpl.setTitle(title);
-		}
-
-		if (description == null) {
-			appImpl.setDescription(StringPool.BLANK);
-		}
-		else {
-			appImpl.setDescription(description);
-		}
-
-		if (category == null) {
-			appImpl.setCategory(StringPool.BLANK);
-		}
-		else {
-			appImpl.setCategory(category);
-		}
-
-		if (iconURL == null) {
-			appImpl.setIconURL(StringPool.BLANK);
-		}
-		else {
-			appImpl.setIconURL(iconURL);
-		}
-
-		if (version == null) {
-			appImpl.setVersion(StringPool.BLANK);
-		}
-		else {
-			appImpl.setVersion(version);
-		}
-
-		appImpl.resetOriginalValues();
-
-		return appImpl;
-	}
-
-	@Override
-	public void readExternal(ObjectInput objectInput) throws IOException {
-		uuid = objectInput.readUTF();
-		appId = objectInput.readLong();
-		companyId = objectInput.readLong();
-		userId = objectInput.readLong();
-		userName = objectInput.readUTF();
-		createDate = objectInput.readLong();
-		modifiedDate = objectInput.readLong();
-		remoteAppId = objectInput.readLong();
-		title = objectInput.readUTF();
-		description = objectInput.readUTF();
-		category = objectInput.readUTF();
-		iconURL = objectInput.readUTF();
-		version = objectInput.readUTF();
-	}
-
-	@Override
-	public void writeExternal(ObjectOutput objectOutput)
-		throws IOException {
-		if (uuid == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(uuid);
-		}
-
-		objectOutput.writeLong(appId);
-		objectOutput.writeLong(companyId);
-		objectOutput.writeLong(userId);
-
-		if (userName == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(userName);
-		}
-
-		objectOutput.writeLong(createDate);
-		objectOutput.writeLong(modifiedDate);
-		objectOutput.writeLong(remoteAppId);
-
-		if (title == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(title);
-		}
-
-		if (description == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(description);
-		}
-
-		if (category == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(category);
-		}
-
-		if (iconURL == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(iconURL);
-		}
-
-		if (version == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(version);
-		}
-	}
-
-	public String uuid;
-	public long appId;
-	public long companyId;
-	public long userId;
-	public String userName;
-	public long createDate;
-	public long modifiedDate;
-	public long remoteAppId;
-	public String title;
-	public String description;
-	public String category;
-	public String iconURL;
-	public String version;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppImpl.java
deleted file mode 100644
index 2ecceae..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppImpl.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-import com.liferay.portal.kernel.deploy.DeployManagerUtil;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.util.ArrayUtil;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.model.CompanyConstants;
-import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
-import com.liferay.portlet.documentlibrary.store.Store;
-
-import java.util.List;
-
-/**
- * @author Ryan Park
- */
-public class AppImpl extends AppBaseImpl {
-
-	public AppImpl() {
-	}
-
-	@Override
-	public String[] addContextName(String contextName) {
-		if (_contextNames == null) {
-			_contextNames = new String[] {contextName};
-		}
-		else {
-			_contextNames = ArrayUtil.append(_contextNames, contextName);
-		}
-
-		return _contextNames;
-	}
-
-	@Override
-	public String[] getContextNames() throws SystemException {
-		if (_contextNames != null) {
-			return _contextNames;
-		}
-
-		List<Module> modules = ModuleLocalServiceUtil.getModules(getAppId());
-
-		String[] contextNames = new String[modules.size()];
-
-		for (int i = 0; i < modules.size(); i++) {
-			Module module = modules.get(i);
-
-			contextNames[i] = module.getContextName();
-		}
-
-		_contextNames = contextNames;
-
-		return _contextNames;
-	}
-
-	@Override
-	public String getFileDir() {
-		return _DIR_NAME;
-	}
-
-	@Override
-	public String getFileName() {
-		return getAppId() + StringPool.PERIOD + _EXTENSION;
-	}
-
-	@Override
-	public String getFilePath() {
-		return getFileDir() + StringPool.SLASH + getFileName();
-	}
-
-	@Override
-	public boolean isDownloaded() throws PortalException, SystemException {
-		return DLStoreUtil.hasFile(
-			getCompanyId(), CompanyConstants.SYSTEM, getFilePath(),
-			Store.VERSION_DEFAULT);
-	}
-
-	@Override
-	public boolean isInstalled() throws SystemException {
-		String[] contextNames = getContextNames();
-
-		if (contextNames.length == 0) {
-			return false;
-		}
-
-		for (String contextName : contextNames) {
-			if (!DeployManagerUtil.isDeployed(contextName)) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	private static final String _DIR_NAME = "marketplace";
-
-	private static final String _EXTENSION = "lpkg";
-
-	private String[] _contextNames;
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppModelImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppModelImpl.java
deleted file mode 100644
index 31191e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/AppModelImpl.java
+++ /dev/null
@@ -1,854 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.model.AppModel;
-import com.liferay.marketplace.model.AppSoap;
-
-import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.json.JSON;
-import com.liferay.portal.kernel.lar.StagedModelType;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.ProxyUtil;
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.model.CacheModel;
-import com.liferay.portal.model.impl.BaseModelImpl;
-import com.liferay.portal.service.ServiceContext;
-import com.liferay.portal.util.PortalUtil;
-
-import com.liferay.portlet.expando.model.ExpandoBridge;
-import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil;
-
-import java.io.Serializable;
-
-import java.sql.Types;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The base model implementation for the App service. Represents a row in the &quot;Marketplace_App&quot; database table, with each column mapped to a property of this class.
- *
- * <p>
- * This implementation and its corresponding interface {@link com.liferay.marketplace.model.AppModel} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link AppImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see AppImpl
- * @see com.liferay.marketplace.model.App
- * @see com.liferay.marketplace.model.AppModel
- * @generated
- */
-@JSON(strict = true)
-public class AppModelImpl extends BaseModelImpl<App> implements AppModel {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. All methods that expect a app model instance should use the {@link com.liferay.marketplace.model.App} interface instead.
-	 */
-	public static final String TABLE_NAME = "Marketplace_App";
-	public static final Object[][] TABLE_COLUMNS = {
-			{ "uuid_", Types.VARCHAR },
-			{ "appId", Types.BIGINT },
-			{ "companyId", Types.BIGINT },
-			{ "userId", Types.BIGINT },
-			{ "userName", Types.VARCHAR },
-			{ "createDate", Types.TIMESTAMP },
-			{ "modifiedDate", Types.TIMESTAMP },
-			{ "remoteAppId", Types.BIGINT },
-			{ "title", Types.VARCHAR },
-			{ "description", Types.VARCHAR },
-			{ "category", Types.VARCHAR },
-			{ "iconURL", Types.VARCHAR },
-			{ "version", Types.VARCHAR }
-		};
-	public static final String TABLE_SQL_CREATE = "create table Marketplace_App (uuid_ VARCHAR(75) null,appId LONG not null primary key,companyId LONG,userId LONG,userName VARCHAR(75) null,createDate DATE null,modifiedDate DATE null,remoteAppId LONG,title VARCHAR(75) null,description STRING null,category VARCHAR(75) null,iconURL STRING null,version VARCHAR(75) null)";
-	public static final String TABLE_SQL_DROP = "drop table Marketplace_App";
-	public static final String ORDER_BY_JPQL = " ORDER BY app.appId ASC";
-	public static final String ORDER_BY_SQL = " ORDER BY Marketplace_App.appId ASC";
-	public static final String DATA_SOURCE = "liferayDataSource";
-	public static final String SESSION_FACTORY = "liferaySessionFactory";
-	public static final String TX_MANAGER = "liferayTransactionManager";
-	public static final boolean ENTITY_CACHE_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
-				"value.object.entity.cache.enabled.com.liferay.marketplace.model.App"),
-			true);
-	public static final boolean FINDER_CACHE_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
-				"value.object.finder.cache.enabled.com.liferay.marketplace.model.App"),
-			true);
-	public static final boolean COLUMN_BITMASK_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
-				"value.object.column.bitmask.enabled.com.liferay.marketplace.model.App"),
-			true);
-	public static long CATEGORY_COLUMN_BITMASK = 1L;
-	public static long COMPANYID_COLUMN_BITMASK = 2L;
-	public static long REMOTEAPPID_COLUMN_BITMASK = 4L;
-	public static long UUID_COLUMN_BITMASK = 8L;
-	public static long APPID_COLUMN_BITMASK = 16L;
-
-	/**
-	 * Converts the soap model instance into a normal model instance.
-	 *
-	 * @param soapModel the soap model instance to convert
-	 * @return the normal model instance
-	 */
-	public static App toModel(AppSoap soapModel) {
-		if (soapModel == null) {
-			return null;
-		}
-
-		App model = new AppImpl();
-
-		model.setUuid(soapModel.getUuid());
-		model.setAppId(soapModel.getAppId());
-		model.setCompanyId(soapModel.getCompanyId());
-		model.setUserId(soapModel.getUserId());
-		model.setUserName(soapModel.getUserName());
-		model.setCreateDate(soapModel.getCreateDate());
-		model.setModifiedDate(soapModel.getModifiedDate());
-		model.setRemoteAppId(soapModel.getRemoteAppId());
-		model.setTitle(soapModel.getTitle());
-		model.setDescription(soapModel.getDescription());
-		model.setCategory(soapModel.getCategory());
-		model.setIconURL(soapModel.getIconURL());
-		model.setVersion(soapModel.getVersion());
-
-		return model;
-	}
-
-	/**
-	 * Converts the soap model instances into normal model instances.
-	 *
-	 * @param soapModels the soap model instances to convert
-	 * @return the normal model instances
-	 */
-	public static List<App> toModels(AppSoap[] soapModels) {
-		if (soapModels == null) {
-			return null;
-		}
-
-		List<App> models = new ArrayList<App>(soapModels.length);
-
-		for (AppSoap soapModel : soapModels) {
-			models.add(toModel(soapModel));
-		}
-
-		return models;
-	}
-
-	public static final long LOCK_EXPIRATION_TIME = GetterUtil.getLong(com.liferay.util.service.ServiceProps.get(
-				"lock.expiration.time.com.liferay.marketplace.model.App"));
-
-	public AppModelImpl() {
-	}
-
-	@Override
-	public long getPrimaryKey() {
-		return _appId;
-	}
-
-	@Override
-	public void setPrimaryKey(long primaryKey) {
-		setAppId(primaryKey);
-	}
-
-	@Override
-	public Serializable getPrimaryKeyObj() {
-		return _appId;
-	}
-
-	@Override
-	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
-		setPrimaryKey(((Long)primaryKeyObj).longValue());
-	}
-
-	@Override
-	public Class<?> getModelClass() {
-		return App.class;
-	}
-
-	@Override
-	public String getModelClassName() {
-		return App.class.getName();
-	}
-
-	@Override
-	public Map<String, Object> getModelAttributes() {
-		Map<String, Object> attributes = new HashMap<String, Object>();
-
-		attributes.put("uuid", getUuid());
-		attributes.put("appId", getAppId());
-		attributes.put("companyId", getCompanyId());
-		attributes.put("userId", getUserId());
-		attributes.put("userName", getUserName());
-		attributes.put("createDate", getCreateDate());
-		attributes.put("modifiedDate", getModifiedDate());
-		attributes.put("remoteAppId", getRemoteAppId());
-		attributes.put("title", getTitle());
-		attributes.put("description", getDescription());
-		attributes.put("category", getCategory());
-		attributes.put("iconURL", getIconURL());
-		attributes.put("version", getVersion());
-
-		return attributes;
-	}
-
-	@Override
-	public void setModelAttributes(Map<String, Object> attributes) {
-		String uuid = (String)attributes.get("uuid");
-
-		if (uuid != null) {
-			setUuid(uuid);
-		}
-
-		Long appId = (Long)attributes.get("appId");
-
-		if (appId != null) {
-			setAppId(appId);
-		}
-
-		Long companyId = (Long)attributes.get("companyId");
-
-		if (companyId != null) {
-			setCompanyId(companyId);
-		}
-
-		Long userId = (Long)attributes.get("userId");
-
-		if (userId != null) {
-			setUserId(userId);
-		}
-
-		String userName = (String)attributes.get("userName");
-
-		if (userName != null) {
-			setUserName(userName);
-		}
-
-		Date createDate = (Date)attributes.get("createDate");
-
-		if (createDate != null) {
-			setCreateDate(createDate);
-		}
-
-		Date modifiedDate = (Date)attributes.get("modifiedDate");
-
-		if (modifiedDate != null) {
-			setModifiedDate(modifiedDate);
-		}
-
-		Long remoteAppId = (Long)attributes.get("remoteAppId");
-
-		if (remoteAppId != null) {
-			setRemoteAppId(remoteAppId);
-		}
-
-		String title = (String)attributes.get("title");
-
-		if (title != null) {
-			setTitle(title);
-		}
-
-		String description = (String)attributes.get("description");
-
-		if (description != null) {
-			setDescription(description);
-		}
-
-		String category = (String)attributes.get("category");
-
-		if (category != null) {
-			setCategory(category);
-		}
-
-		String iconURL = (String)attributes.get("iconURL");
-
-		if (iconURL != null) {
-			setIconURL(iconURL);
-		}
-
-		String version = (String)attributes.get("version");
-
-		if (version != null) {
-			setVersion(version);
-		}
-	}
-
-	@JSON
-	@Override
-	public String getUuid() {
-		if (_uuid == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _uuid;
-		}
-	}
-
-	@Override
-	public void setUuid(String uuid) {
-		if (_originalUuid == null) {
-			_originalUuid = _uuid;
-		}
-
-		_uuid = uuid;
-	}
-
-	public String getOriginalUuid() {
-		return GetterUtil.getString(_originalUuid);
-	}
-
-	@JSON
-	@Override
-	public long getAppId() {
-		return _appId;
-	}
-
-	@Override
-	public void setAppId(long appId) {
-		_appId = appId;
-	}
-
-	@JSON
-	@Override
-	public long getCompanyId() {
-		return _companyId;
-	}
-
-	@Override
-	public void setCompanyId(long companyId) {
-		_columnBitmask |= COMPANYID_COLUMN_BITMASK;
-
-		if (!_setOriginalCompanyId) {
-			_setOriginalCompanyId = true;
-
-			_originalCompanyId = _companyId;
-		}
-
-		_companyId = companyId;
-	}
-
-	public long getOriginalCompanyId() {
-		return _originalCompanyId;
-	}
-
-	@JSON
-	@Override
-	public long getUserId() {
-		return _userId;
-	}
-
-	@Override
-	public void setUserId(long userId) {
-		_userId = userId;
-	}
-
-	@Override
-	public String getUserUuid() throws SystemException {
-		return PortalUtil.getUserValue(getUserId(), "uuid", _userUuid);
-	}
-
-	@Override
-	public void setUserUuid(String userUuid) {
-		_userUuid = userUuid;
-	}
-
-	@JSON
-	@Override
-	public String getUserName() {
-		if (_userName == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _userName;
-		}
-	}
-
-	@Override
-	public void setUserName(String userName) {
-		_userName = userName;
-	}
-
-	@JSON
-	@Override
-	public Date getCreateDate() {
-		return _createDate;
-	}
-
-	@Override
-	public void setCreateDate(Date createDate) {
-		_createDate = createDate;
-	}
-
-	@JSON
-	@Override
-	public Date getModifiedDate() {
-		return _modifiedDate;
-	}
-
-	@Override
-	public void setModifiedDate(Date modifiedDate) {
-		_modifiedDate = modifiedDate;
-	}
-
-	@JSON
-	@Override
-	public long getRemoteAppId() {
-		return _remoteAppId;
-	}
-
-	@Override
-	public void setRemoteAppId(long remoteAppId) {
-		_columnBitmask |= REMOTEAPPID_COLUMN_BITMASK;
-
-		if (!_setOriginalRemoteAppId) {
-			_setOriginalRemoteAppId = true;
-
-			_originalRemoteAppId = _remoteAppId;
-		}
-
-		_remoteAppId = remoteAppId;
-	}
-
-	public long getOriginalRemoteAppId() {
-		return _originalRemoteAppId;
-	}
-
-	@JSON
-	@Override
-	public String getTitle() {
-		if (_title == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _title;
-		}
-	}
-
-	@Override
-	public void setTitle(String title) {
-		_title = title;
-	}
-
-	@JSON
-	@Override
-	public String getDescription() {
-		if (_description == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _description;
-		}
-	}
-
-	@Override
-	public void setDescription(String description) {
-		_description = description;
-	}
-
-	@JSON
-	@Override
-	public String getCategory() {
-		if (_category == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _category;
-		}
-	}
-
-	@Override
-	public void setCategory(String category) {
-		_columnBitmask |= CATEGORY_COLUMN_BITMASK;
-
-		if (_originalCategory == null) {
-			_originalCategory = _category;
-		}
-
-		_category = category;
-	}
-
-	public String getOriginalCategory() {
-		return GetterUtil.getString(_originalCategory);
-	}
-
-	@JSON
-	@Override
-	public String getIconURL() {
-		if (_iconURL == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _iconURL;
-		}
-	}
-
-	@Override
-	public void setIconURL(String iconURL) {
-		_iconURL = iconURL;
-	}
-
-	@JSON
-	@Override
-	public String getVersion() {
-		if (_version == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _version;
-		}
-	}
-
-	@Override
-	public void setVersion(String version) {
-		_version = version;
-	}
-
-	@Override
-	public StagedModelType getStagedModelType() {
-		return new StagedModelType(PortalUtil.getClassNameId(
-				App.class.getName()));
-	}
-
-	public long getColumnBitmask() {
-		return _columnBitmask;
-	}
-
-	@Override
-	public ExpandoBridge getExpandoBridge() {
-		return ExpandoBridgeFactoryUtil.getExpandoBridge(getCompanyId(),
-			App.class.getName(), getPrimaryKey());
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(ServiceContext serviceContext) {
-		ExpandoBridge expandoBridge = getExpandoBridge();
-
-		expandoBridge.setAttributes(serviceContext);
-	}
-
-	@Override
-	public App toEscapedModel() {
-		if (_escapedModel == null) {
-			_escapedModel = (App)ProxyUtil.newProxyInstance(_classLoader,
-					_escapedModelInterfaces, new AutoEscapeBeanHandler(this));
-		}
-
-		return _escapedModel;
-	}
-
-	@Override
-	public Object clone() {
-		AppImpl appImpl = new AppImpl();
-
-		appImpl.setUuid(getUuid());
-		appImpl.setAppId(getAppId());
-		appImpl.setCompanyId(getCompanyId());
-		appImpl.setUserId(getUserId());
-		appImpl.setUserName(getUserName());
-		appImpl.setCreateDate(getCreateDate());
-		appImpl.setModifiedDate(getModifiedDate());
-		appImpl.setRemoteAppId(getRemoteAppId());
-		appImpl.setTitle(getTitle());
-		appImpl.setDescription(getDescription());
-		appImpl.setCategory(getCategory());
-		appImpl.setIconURL(getIconURL());
-		appImpl.setVersion(getVersion());
-
-		appImpl.resetOriginalValues();
-
-		return appImpl;
-	}
-
-	@Override
-	public int compareTo(App app) {
-		long primaryKey = app.getPrimaryKey();
-
-		if (getPrimaryKey() < primaryKey) {
-			return -1;
-		}
-		else if (getPrimaryKey() > primaryKey) {
-			return 1;
-		}
-		else {
-			return 0;
-		}
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-
-		if (!(obj instanceof App)) {
-			return false;
-		}
-
-		App app = (App)obj;
-
-		long primaryKey = app.getPrimaryKey();
-
-		if (getPrimaryKey() == primaryKey) {
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-
-	@Override
-	public int hashCode() {
-		return (int)getPrimaryKey();
-	}
-
-	@Override
-	public void resetOriginalValues() {
-		AppModelImpl appModelImpl = this;
-
-		appModelImpl._originalUuid = appModelImpl._uuid;
-
-		appModelImpl._originalCompanyId = appModelImpl._companyId;
-
-		appModelImpl._setOriginalCompanyId = false;
-
-		appModelImpl._originalRemoteAppId = appModelImpl._remoteAppId;
-
-		appModelImpl._setOriginalRemoteAppId = false;
-
-		appModelImpl._originalCategory = appModelImpl._category;
-
-		appModelImpl._columnBitmask = 0;
-	}
-
-	@Override
-	public CacheModel<App> toCacheModel() {
-		AppCacheModel appCacheModel = new AppCacheModel();
-
-		appCacheModel.uuid = getUuid();
-
-		String uuid = appCacheModel.uuid;
-
-		if ((uuid != null) && (uuid.length() == 0)) {
-			appCacheModel.uuid = null;
-		}
-
-		appCacheModel.appId = getAppId();
-
-		appCacheModel.companyId = getCompanyId();
-
-		appCacheModel.userId = getUserId();
-
-		appCacheModel.userName = getUserName();
-
-		String userName = appCacheModel.userName;
-
-		if ((userName != null) && (userName.length() == 0)) {
-			appCacheModel.userName = null;
-		}
-
-		Date createDate = getCreateDate();
-
-		if (createDate != null) {
-			appCacheModel.createDate = createDate.getTime();
-		}
-		else {
-			appCacheModel.createDate = Long.MIN_VALUE;
-		}
-
-		Date modifiedDate = getModifiedDate();
-
-		if (modifiedDate != null) {
-			appCacheModel.modifiedDate = modifiedDate.getTime();
-		}
-		else {
-			appCacheModel.modifiedDate = Long.MIN_VALUE;
-		}
-
-		appCacheModel.remoteAppId = getRemoteAppId();
-
-		appCacheModel.title = getTitle();
-
-		String title = appCacheModel.title;
-
-		if ((title != null) && (title.length() == 0)) {
-			appCacheModel.title = null;
-		}
-
-		appCacheModel.description = getDescription();
-
-		String description = appCacheModel.description;
-
-		if ((description != null) && (description.length() == 0)) {
-			appCacheModel.description = null;
-		}
-
-		appCacheModel.category = getCategory();
-
-		String category = appCacheModel.category;
-
-		if ((category != null) && (category.length() == 0)) {
-			appCacheModel.category = null;
-		}
-
-		appCacheModel.iconURL = getIconURL();
-
-		String iconURL = appCacheModel.iconURL;
-
-		if ((iconURL != null) && (iconURL.length() == 0)) {
-			appCacheModel.iconURL = null;
-		}
-
-		appCacheModel.version = getVersion();
-
-		String version = appCacheModel.version;
-
-		if ((version != null) && (version.length() == 0)) {
-			appCacheModel.version = null;
-		}
-
-		return appCacheModel;
-	}
-
-	@Override
-	public String toString() {
-		StringBundler sb = new StringBundler(27);
-
-		sb.append("{uuid=");
-		sb.append(getUuid());
-		sb.append(", appId=");
-		sb.append(getAppId());
-		sb.append(", companyId=");
-		sb.append(getCompanyId());
-		sb.append(", userId=");
-		sb.append(getUserId());
-		sb.append(", userName=");
-		sb.append(getUserName());
-		sb.append(", createDate=");
-		sb.append(getCreateDate());
-		sb.append(", modifiedDate=");
-		sb.append(getModifiedDate());
-		sb.append(", remoteAppId=");
-		sb.append(getRemoteAppId());
-		sb.append(", title=");
-		sb.append(getTitle());
-		sb.append(", description=");
-		sb.append(getDescription());
-		sb.append(", category=");
-		sb.append(getCategory());
-		sb.append(", iconURL=");
-		sb.append(getIconURL());
-		sb.append(", version=");
-		sb.append(getVersion());
-		sb.append("}");
-
-		return sb.toString();
-	}
-
-	@Override
-	public String toXmlString() {
-		StringBundler sb = new StringBundler(43);
-
-		sb.append("<model><model-name>");
-		sb.append("com.liferay.marketplace.model.App");
-		sb.append("</model-name>");
-
-		sb.append(
-			"<column><column-name>uuid</column-name><column-value><![CDATA[");
-		sb.append(getUuid());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>appId</column-name><column-value><![CDATA[");
-		sb.append(getAppId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>companyId</column-name><column-value><![CDATA[");
-		sb.append(getCompanyId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>userId</column-name><column-value><![CDATA[");
-		sb.append(getUserId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>userName</column-name><column-value><![CDATA[");
-		sb.append(getUserName());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>createDate</column-name><column-value><![CDATA[");
-		sb.append(getCreateDate());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>modifiedDate</column-name><column-value><![CDATA[");
-		sb.append(getModifiedDate());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>remoteAppId</column-name><column-value><![CDATA[");
-		sb.append(getRemoteAppId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>title</column-name><column-value><![CDATA[");
-		sb.append(getTitle());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>description</column-name><column-value><![CDATA[");
-		sb.append(getDescription());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>category</column-name><column-value><![CDATA[");
-		sb.append(getCategory());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>iconURL</column-name><column-value><![CDATA[");
-		sb.append(getIconURL());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>version</column-name><column-value><![CDATA[");
-		sb.append(getVersion());
-		sb.append("]]></column-value></column>");
-
-		sb.append("</model>");
-
-		return sb.toString();
-	}
-
-	private static ClassLoader _classLoader = App.class.getClassLoader();
-	private static Class<?>[] _escapedModelInterfaces = new Class[] { App.class };
-	private String _uuid;
-	private String _originalUuid;
-	private long _appId;
-	private long _companyId;
-	private long _originalCompanyId;
-	private boolean _setOriginalCompanyId;
-	private long _userId;
-	private String _userUuid;
-	private String _userName;
-	private Date _createDate;
-	private Date _modifiedDate;
-	private long _remoteAppId;
-	private long _originalRemoteAppId;
-	private boolean _setOriginalRemoteAppId;
-	private String _title;
-	private String _description;
-	private String _category;
-	private String _originalCategory;
-	private String _iconURL;
-	private String _version;
-	private long _columnBitmask;
-	private App _escapedModel;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleBaseImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleBaseImpl.java
deleted file mode 100644
index f27a5aa..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleBaseImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-
-import com.liferay.portal.kernel.exception.SystemException;
-
-/**
- * The extended model base implementation for the Module service. Represents a row in the &quot;Marketplace_Module&quot; database table, with each column mapped to a property of this class.
- *
- * <p>
- * This class exists only as a container for the default extended model level methods generated by ServiceBuilder. Helper methods and all application logic should be put in {@link ModuleImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see ModuleImpl
- * @see com.liferay.marketplace.model.Module
- * @generated
- */
-public abstract class ModuleBaseImpl extends ModuleModelImpl implements Module {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. All methods that expect a module model instance should use the {@link Module} interface instead.
-	 */
-	@Override
-	public void persist() throws SystemException {
-		if (this.isNew()) {
-			ModuleLocalServiceUtil.addModule(this);
-		}
-		else {
-			ModuleLocalServiceUtil.updateModule(this);
-		}
-	}
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleCacheModel.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleCacheModel.java
deleted file mode 100644
index 1055c0f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleCacheModel.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.Module;
-
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.model.CacheModel;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-
-/**
- * The cache model class for representing Module in entity cache.
- *
- * @author Ryan Park
- * @see Module
- * @generated
- */
-public class ModuleCacheModel implements CacheModel<Module>, Externalizable {
-	@Override
-	public String toString() {
-		StringBundler sb = new StringBundler(9);
-
-		sb.append("{uuid=");
-		sb.append(uuid);
-		sb.append(", moduleId=");
-		sb.append(moduleId);
-		sb.append(", appId=");
-		sb.append(appId);
-		sb.append(", contextName=");
-		sb.append(contextName);
-		sb.append("}");
-
-		return sb.toString();
-	}
-
-	@Override
-	public Module toEntityModel() {
-		ModuleImpl moduleImpl = new ModuleImpl();
-
-		if (uuid == null) {
-			moduleImpl.setUuid(StringPool.BLANK);
-		}
-		else {
-			moduleImpl.setUuid(uuid);
-		}
-
-		moduleImpl.setModuleId(moduleId);
-		moduleImpl.setAppId(appId);
-
-		if (contextName == null) {
-			moduleImpl.setContextName(StringPool.BLANK);
-		}
-		else {
-			moduleImpl.setContextName(contextName);
-		}
-
-		moduleImpl.resetOriginalValues();
-
-		return moduleImpl;
-	}
-
-	@Override
-	public void readExternal(ObjectInput objectInput) throws IOException {
-		uuid = objectInput.readUTF();
-		moduleId = objectInput.readLong();
-		appId = objectInput.readLong();
-		contextName = objectInput.readUTF();
-	}
-
-	@Override
-	public void writeExternal(ObjectOutput objectOutput)
-		throws IOException {
-		if (uuid == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(uuid);
-		}
-
-		objectOutput.writeLong(moduleId);
-		objectOutput.writeLong(appId);
-
-		if (contextName == null) {
-			objectOutput.writeUTF(StringPool.BLANK);
-		}
-		else {
-			objectOutput.writeUTF(contextName);
-		}
-	}
-
-	public String uuid;
-	public long moduleId;
-	public long appId;
-	public String contextName;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleImpl.java
deleted file mode 100644
index 31f914b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-/**
- * @author Ryan Park
- */
-public class ModuleImpl extends ModuleBaseImpl {
-
-	public ModuleImpl() {
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleModelImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleModelImpl.java
deleted file mode 100644
index 51cad8f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/model/impl/ModuleModelImpl.java
+++ /dev/null
@@ -1,425 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.model.impl;
-
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.model.ModuleModel;
-
-import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.ProxyUtil;
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.model.CacheModel;
-import com.liferay.portal.model.impl.BaseModelImpl;
-import com.liferay.portal.service.ServiceContext;
-
-import com.liferay.portlet.expando.model.ExpandoBridge;
-import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil;
-
-import java.io.Serializable;
-
-import java.sql.Types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * The base model implementation for the Module service. Represents a row in the &quot;Marketplace_Module&quot; database table, with each column mapped to a property of this class.
- *
- * <p>
- * This implementation and its corresponding interface {@link com.liferay.marketplace.model.ModuleModel} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link ModuleImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see ModuleImpl
- * @see com.liferay.marketplace.model.Module
- * @see com.liferay.marketplace.model.ModuleModel
- * @generated
- */
-public class ModuleModelImpl extends BaseModelImpl<Module>
-	implements ModuleModel {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. All methods that expect a module model instance should use the {@link com.liferay.marketplace.model.Module} interface instead.
-	 */
-	public static final String TABLE_NAME = "Marketplace_Module";
-	public static final Object[][] TABLE_COLUMNS = {
-			{ "uuid_", Types.VARCHAR },
-			{ "moduleId", Types.BIGINT },
-			{ "appId", Types.BIGINT },
-			{ "contextName", Types.VARCHAR }
-		};
-	public static final String TABLE_SQL_CREATE = "create table Marketplace_Module (uuid_ VARCHAR(75) null,moduleId LONG not null primary key,appId LONG,contextName VARCHAR(75) null)";
-	public static final String TABLE_SQL_DROP = "drop table Marketplace_Module";
-	public static final String ORDER_BY_JPQL = " ORDER BY module.moduleId ASC";
-	public static final String ORDER_BY_SQL = " ORDER BY Marketplace_Module.moduleId ASC";
-	public static final String DATA_SOURCE = "liferayDataSource";
-	public static final String SESSION_FACTORY = "liferaySessionFactory";
-	public static final String TX_MANAGER = "liferayTransactionManager";
-	public static final boolean ENTITY_CACHE_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
-				"value.object.entity.cache.enabled.com.liferay.marketplace.model.Module"),
-			true);
-	public static final boolean FINDER_CACHE_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
-				"value.object.finder.cache.enabled.com.liferay.marketplace.model.Module"),
-			true);
-	public static final boolean COLUMN_BITMASK_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
-				"value.object.column.bitmask.enabled.com.liferay.marketplace.model.Module"),
-			true);
-	public static long APPID_COLUMN_BITMASK = 1L;
-	public static long CONTEXTNAME_COLUMN_BITMASK = 2L;
-	public static long UUID_COLUMN_BITMASK = 4L;
-	public static long MODULEID_COLUMN_BITMASK = 8L;
-	public static final long LOCK_EXPIRATION_TIME = GetterUtil.getLong(com.liferay.util.service.ServiceProps.get(
-				"lock.expiration.time.com.liferay.marketplace.model.Module"));
-
-	public ModuleModelImpl() {
-	}
-
-	@Override
-	public long getPrimaryKey() {
-		return _moduleId;
-	}
-
-	@Override
-	public void setPrimaryKey(long primaryKey) {
-		setModuleId(primaryKey);
-	}
-
-	@Override
-	public Serializable getPrimaryKeyObj() {
-		return _moduleId;
-	}
-
-	@Override
-	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
-		setPrimaryKey(((Long)primaryKeyObj).longValue());
-	}
-
-	@Override
-	public Class<?> getModelClass() {
-		return Module.class;
-	}
-
-	@Override
-	public String getModelClassName() {
-		return Module.class.getName();
-	}
-
-	@Override
-	public Map<String, Object> getModelAttributes() {
-		Map<String, Object> attributes = new HashMap<String, Object>();
-
-		attributes.put("uuid", getUuid());
-		attributes.put("moduleId", getModuleId());
-		attributes.put("appId", getAppId());
-		attributes.put("contextName", getContextName());
-
-		return attributes;
-	}
-
-	@Override
-	public void setModelAttributes(Map<String, Object> attributes) {
-		String uuid = (String)attributes.get("uuid");
-
-		if (uuid != null) {
-			setUuid(uuid);
-		}
-
-		Long moduleId = (Long)attributes.get("moduleId");
-
-		if (moduleId != null) {
-			setModuleId(moduleId);
-		}
-
-		Long appId = (Long)attributes.get("appId");
-
-		if (appId != null) {
-			setAppId(appId);
-		}
-
-		String contextName = (String)attributes.get("contextName");
-
-		if (contextName != null) {
-			setContextName(contextName);
-		}
-	}
-
-	@Override
-	public String getUuid() {
-		if (_uuid == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _uuid;
-		}
-	}
-
-	@Override
-	public void setUuid(String uuid) {
-		if (_originalUuid == null) {
-			_originalUuid = _uuid;
-		}
-
-		_uuid = uuid;
-	}
-
-	public String getOriginalUuid() {
-		return GetterUtil.getString(_originalUuid);
-	}
-
-	@Override
-	public long getModuleId() {
-		return _moduleId;
-	}
-
-	@Override
-	public void setModuleId(long moduleId) {
-		_moduleId = moduleId;
-	}
-
-	@Override
-	public long getAppId() {
-		return _appId;
-	}
-
-	@Override
-	public void setAppId(long appId) {
-		_columnBitmask |= APPID_COLUMN_BITMASK;
-
-		if (!_setOriginalAppId) {
-			_setOriginalAppId = true;
-
-			_originalAppId = _appId;
-		}
-
-		_appId = appId;
-	}
-
-	public long getOriginalAppId() {
-		return _originalAppId;
-	}
-
-	@Override
-	public String getContextName() {
-		if (_contextName == null) {
-			return StringPool.BLANK;
-		}
-		else {
-			return _contextName;
-		}
-	}
-
-	@Override
-	public void setContextName(String contextName) {
-		_columnBitmask |= CONTEXTNAME_COLUMN_BITMASK;
-
-		if (_originalContextName == null) {
-			_originalContextName = _contextName;
-		}
-
-		_contextName = contextName;
-	}
-
-	public String getOriginalContextName() {
-		return GetterUtil.getString(_originalContextName);
-	}
-
-	public long getColumnBitmask() {
-		return _columnBitmask;
-	}
-
-	@Override
-	public ExpandoBridge getExpandoBridge() {
-		return ExpandoBridgeFactoryUtil.getExpandoBridge(0,
-			Module.class.getName(), getPrimaryKey());
-	}
-
-	@Override
-	public void setExpandoBridgeAttributes(ServiceContext serviceContext) {
-		ExpandoBridge expandoBridge = getExpandoBridge();
-
-		expandoBridge.setAttributes(serviceContext);
-	}
-
-	@Override
-	public Module toEscapedModel() {
-		if (_escapedModel == null) {
-			_escapedModel = (Module)ProxyUtil.newProxyInstance(_classLoader,
-					_escapedModelInterfaces, new AutoEscapeBeanHandler(this));
-		}
-
-		return _escapedModel;
-	}
-
-	@Override
-	public Object clone() {
-		ModuleImpl moduleImpl = new ModuleImpl();
-
-		moduleImpl.setUuid(getUuid());
-		moduleImpl.setModuleId(getModuleId());
-		moduleImpl.setAppId(getAppId());
-		moduleImpl.setContextName(getContextName());
-
-		moduleImpl.resetOriginalValues();
-
-		return moduleImpl;
-	}
-
-	@Override
-	public int compareTo(Module module) {
-		long primaryKey = module.getPrimaryKey();
-
-		if (getPrimaryKey() < primaryKey) {
-			return -1;
-		}
-		else if (getPrimaryKey() > primaryKey) {
-			return 1;
-		}
-		else {
-			return 0;
-		}
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-
-		if (!(obj instanceof Module)) {
-			return false;
-		}
-
-		Module module = (Module)obj;
-
-		long primaryKey = module.getPrimaryKey();
-
-		if (getPrimaryKey() == primaryKey) {
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-
-	@Override
-	public int hashCode() {
-		return (int)getPrimaryKey();
-	}
-
-	@Override
-	public void resetOriginalValues() {
-		ModuleModelImpl moduleModelImpl = this;
-
-		moduleModelImpl._originalUuid = moduleModelImpl._uuid;
-
-		moduleModelImpl._originalAppId = moduleModelImpl._appId;
-
-		moduleModelImpl._setOriginalAppId = false;
-
-		moduleModelImpl._originalContextName = moduleModelImpl._contextName;
-
-		moduleModelImpl._columnBitmask = 0;
-	}
-
-	@Override
-	public CacheModel<Module> toCacheModel() {
-		ModuleCacheModel moduleCacheModel = new ModuleCacheModel();
-
-		moduleCacheModel.uuid = getUuid();
-
-		String uuid = moduleCacheModel.uuid;
-
-		if ((uuid != null) && (uuid.length() == 0)) {
-			moduleCacheModel.uuid = null;
-		}
-
-		moduleCacheModel.moduleId = getModuleId();
-
-		moduleCacheModel.appId = getAppId();
-
-		moduleCacheModel.contextName = getContextName();
-
-		String contextName = moduleCacheModel.contextName;
-
-		if ((contextName != null) && (contextName.length() == 0)) {
-			moduleCacheModel.contextName = null;
-		}
-
-		return moduleCacheModel;
-	}
-
-	@Override
-	public String toString() {
-		StringBundler sb = new StringBundler(9);
-
-		sb.append("{uuid=");
-		sb.append(getUuid());
-		sb.append(", moduleId=");
-		sb.append(getModuleId());
-		sb.append(", appId=");
-		sb.append(getAppId());
-		sb.append(", contextName=");
-		sb.append(getContextName());
-		sb.append("}");
-
-		return sb.toString();
-	}
-
-	@Override
-	public String toXmlString() {
-		StringBundler sb = new StringBundler(16);
-
-		sb.append("<model><model-name>");
-		sb.append("com.liferay.marketplace.model.Module");
-		sb.append("</model-name>");
-
-		sb.append(
-			"<column><column-name>uuid</column-name><column-value><![CDATA[");
-		sb.append(getUuid());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>moduleId</column-name><column-value><![CDATA[");
-		sb.append(getModuleId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>appId</column-name><column-value><![CDATA[");
-		sb.append(getAppId());
-		sb.append("]]></column-value></column>");
-		sb.append(
-			"<column><column-name>contextName</column-name><column-value><![CDATA[");
-		sb.append(getContextName());
-		sb.append("]]></column-value></column>");
-
-		sb.append("</model>");
-
-		return sb.toString();
-	}
-
-	private static ClassLoader _classLoader = Module.class.getClassLoader();
-	private static Class<?>[] _escapedModelInterfaces = new Class[] { Module.class };
-	private String _uuid;
-	private String _originalUuid;
-	private long _moduleId;
-	private long _appId;
-	private long _originalAppId;
-	private boolean _setOriginalAppId;
-	private String _contextName;
-	private String _originalContextName;
-	private long _columnBitmask;
-	private Module _escapedModel;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppLocalServiceBaseImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppLocalServiceBaseImpl.java
deleted file mode 100644
index 36a37db..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppLocalServiceBaseImpl.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.base;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.AppLocalService;
-import com.liferay.marketplace.service.persistence.AppPersistence;
-import com.liferay.marketplace.service.persistence.ModulePersistence;
-
-import com.liferay.portal.kernel.bean.BeanReference;
-import com.liferay.portal.kernel.bean.IdentifiableBean;
-import com.liferay.portal.kernel.dao.jdbc.SqlUpdate;
-import com.liferay.portal.kernel.dao.jdbc.SqlUpdateFactoryUtil;
-import com.liferay.portal.kernel.dao.orm.DynamicQuery;
-import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
-import com.liferay.portal.kernel.dao.orm.Projection;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.search.Indexable;
-import com.liferay.portal.kernel.search.IndexableType;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.model.PersistedModel;
-import com.liferay.portal.service.BaseLocalServiceImpl;
-import com.liferay.portal.service.PersistedModelLocalServiceRegistryUtil;
-import com.liferay.portal.service.persistence.UserPersistence;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.sql.DataSource;
-
-/**
- * Provides the base implementation for the app local service.
- *
- * <p>
- * This implementation exists only as a container for the default service methods generated by ServiceBuilder. All custom service methods should be put in {@link com.liferay.marketplace.service.impl.AppLocalServiceImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see com.liferay.marketplace.service.impl.AppLocalServiceImpl
- * @see com.liferay.marketplace.service.AppLocalServiceUtil
- * @generated
- */
-public abstract class AppLocalServiceBaseImpl extends BaseLocalServiceImpl
-	implements AppLocalService, IdentifiableBean {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. Always use {@link com.liferay.marketplace.service.AppLocalServiceUtil} to access the app local service.
-	 */
-
-	/**
-	 * Adds the app to the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param app the app
-	 * @return the app that was added
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.REINDEX)
-	@Override
-	public App addApp(App app) throws SystemException {
-		app.setNew(true);
-
-		return appPersistence.update(app);
-	}
-
-	/**
-	 * Creates a new app with the primary key. Does not add the app to the database.
-	 *
-	 * @param appId the primary key for the new app
-	 * @return the new app
-	 */
-	@Override
-	public App createApp(long appId) {
-		return appPersistence.create(appId);
-	}
-
-	/**
-	 * Deletes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param appId the primary key of the app
-	 * @return the app that was removed
-	 * @throws PortalException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.DELETE)
-	@Override
-	public App deleteApp(long appId) throws PortalException, SystemException {
-		return appPersistence.remove(appId);
-	}
-
-	/**
-	 * Deletes the app from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param app the app
-	 * @return the app that was removed
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.DELETE)
-	@Override
-	public App deleteApp(App app) throws SystemException {
-		return appPersistence.remove(app);
-	}
-
-	@Override
-	public DynamicQuery dynamicQuery() {
-		Class<?> clazz = getClass();
-
-		return DynamicQueryFactoryUtil.forClass(App.class,
-			clazz.getClassLoader());
-	}
-
-	/**
-	 * Performs a dynamic query on the database and returns the matching rows.
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @return the matching rows
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	@SuppressWarnings("rawtypes")
-	public List dynamicQuery(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return appPersistence.findWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * Performs a dynamic query on the database and returns a range of the matching rows.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @param start the lower bound of the range of model instances
-	 * @param end the upper bound of the range of model instances (not inclusive)
-	 * @return the range of matching rows
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	@SuppressWarnings("rawtypes")
-	public List dynamicQuery(DynamicQuery dynamicQuery, int start, int end)
-		throws SystemException {
-		return appPersistence.findWithDynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	 * Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @param start the lower bound of the range of model instances
-	 * @param end the upper bound of the range of model instances (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching rows
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	@SuppressWarnings("rawtypes")
-	public List dynamicQuery(DynamicQuery dynamicQuery, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		return appPersistence.findWithDynamicQuery(dynamicQuery, start, end,
-			orderByComparator);
-	}
-
-	/**
-	 * Returns the number of rows that match the dynamic query.
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @return the number of rows that match the dynamic query
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public long dynamicQueryCount(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return appPersistence.countWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * Returns the number of rows that match the dynamic query.
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @param projection the projection to apply to the query
-	 * @return the number of rows that match the dynamic query
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public long dynamicQueryCount(DynamicQuery dynamicQuery,
-		Projection projection) throws SystemException {
-		return appPersistence.countWithDynamicQuery(dynamicQuery, projection);
-	}
-
-	@Override
-	public App fetchApp(long appId) throws SystemException {
-		return appPersistence.fetchByPrimaryKey(appId);
-	}
-
-	/**
-	 * Returns the app with the matching UUID and company.
-	 *
-	 * @param uuid the app's UUID
-	 * @param  companyId the primary key of the company
-	 * @return the matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchAppByUuidAndCompanyId(String uuid, long companyId)
-		throws SystemException {
-		return appPersistence.fetchByUuid_C_First(uuid, companyId, null);
-	}
-
-	/**
-	 * Returns the app with the primary key.
-	 *
-	 * @param appId the primary key of the app
-	 * @return the app
-	 * @throws PortalException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App getApp(long appId) throws PortalException, SystemException {
-		return appPersistence.findByPrimaryKey(appId);
-	}
-
-	@Override
-	public PersistedModel getPersistedModel(Serializable primaryKeyObj)
-		throws PortalException, SystemException {
-		return appPersistence.findByPrimaryKey(primaryKeyObj);
-	}
-
-	/**
-	 * Returns the app with the matching UUID and company.
-	 *
-	 * @param uuid the app's UUID
-	 * @param  companyId the primary key of the company
-	 * @return the matching app
-	 * @throws PortalException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App getAppByUuidAndCompanyId(String uuid, long companyId)
-		throws PortalException, SystemException {
-		return appPersistence.findByUuid_C_First(uuid, companyId, null);
-	}
-
-	/**
-	 * Returns a range of all the apps.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @return the range of apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> getApps(int start, int end) throws SystemException {
-		return appPersistence.findAll(start, end);
-	}
-
-	/**
-	 * Returns the number of apps.
-	 *
-	 * @return the number of apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int getAppsCount() throws SystemException {
-		return appPersistence.countAll();
-	}
-
-	/**
-	 * Updates the app in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	 *
-	 * @param app the app
-	 * @return the app that was updated
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.REINDEX)
-	@Override
-	public App updateApp(App app) throws SystemException {
-		return appPersistence.update(app);
-	}
-
-	/**
-	 * Returns the app local service.
-	 *
-	 * @return the app local service
-	 */
-	public com.liferay.marketplace.service.AppLocalService getAppLocalService() {
-		return appLocalService;
-	}
-
-	/**
-	 * Sets the app local service.
-	 *
-	 * @param appLocalService the app local service
-	 */
-	public void setAppLocalService(
-		com.liferay.marketplace.service.AppLocalService appLocalService) {
-		this.appLocalService = appLocalService;
-	}
-
-	/**
-	 * Returns the app remote service.
-	 *
-	 * @return the app remote service
-	 */
-	public com.liferay.marketplace.service.AppService getAppService() {
-		return appService;
-	}
-
-	/**
-	 * Sets the app remote service.
-	 *
-	 * @param appService the app remote service
-	 */
-	public void setAppService(
-		com.liferay.marketplace.service.AppService appService) {
-		this.appService = appService;
-	}
-
-	/**
-	 * Returns the app persistence.
-	 *
-	 * @return the app persistence
-	 */
-	public AppPersistence getAppPersistence() {
-		return appPersistence;
-	}
-
-	/**
-	 * Sets the app persistence.
-	 *
-	 * @param appPersistence the app persistence
-	 */
-	public void setAppPersistence(AppPersistence appPersistence) {
-		this.appPersistence = appPersistence;
-	}
-
-	/**
-	 * Returns the module local service.
-	 *
-	 * @return the module local service
-	 */
-	public com.liferay.marketplace.service.ModuleLocalService getModuleLocalService() {
-		return moduleLocalService;
-	}
-
-	/**
-	 * Sets the module local service.
-	 *
-	 * @param moduleLocalService the module local service
-	 */
-	public void setModuleLocalService(
-		com.liferay.marketplace.service.ModuleLocalService moduleLocalService) {
-		this.moduleLocalService = moduleLocalService;
-	}
-
-	/**
-	 * Returns the module persistence.
-	 *
-	 * @return the module persistence
-	 */
-	public ModulePersistence getModulePersistence() {
-		return modulePersistence;
-	}
-
-	/**
-	 * Sets the module persistence.
-	 *
-	 * @param modulePersistence the module persistence
-	 */
-	public void setModulePersistence(ModulePersistence modulePersistence) {
-		this.modulePersistence = modulePersistence;
-	}
-
-	/**
-	 * Returns the counter local service.
-	 *
-	 * @return the counter local service
-	 */
-	public com.liferay.counter.service.CounterLocalService getCounterLocalService() {
-		return counterLocalService;
-	}
-
-	/**
-	 * Sets the counter local service.
-	 *
-	 * @param counterLocalService the counter local service
-	 */
-	public void setCounterLocalService(
-		com.liferay.counter.service.CounterLocalService counterLocalService) {
-		this.counterLocalService = counterLocalService;
-	}
-
-	/**
-	 * Returns the resource local service.
-	 *
-	 * @return the resource local service
-	 */
-	public com.liferay.portal.service.ResourceLocalService getResourceLocalService() {
-		return resourceLocalService;
-	}
-
-	/**
-	 * Sets the resource local service.
-	 *
-	 * @param resourceLocalService the resource local service
-	 */
-	public void setResourceLocalService(
-		com.liferay.portal.service.ResourceLocalService resourceLocalService) {
-		this.resourceLocalService = resourceLocalService;
-	}
-
-	/**
-	 * Returns the user local service.
-	 *
-	 * @return the user local service
-	 */
-	public com.liferay.portal.service.UserLocalService getUserLocalService() {
-		return userLocalService;
-	}
-
-	/**
-	 * Sets the user local service.
-	 *
-	 * @param userLocalService the user local service
-	 */
-	public void setUserLocalService(
-		com.liferay.portal.service.UserLocalService userLocalService) {
-		this.userLocalService = userLocalService;
-	}
-
-	/**
-	 * Returns the user remote service.
-	 *
-	 * @return the user remote service
-	 */
-	public com.liferay.portal.service.UserService getUserService() {
-		return userService;
-	}
-
-	/**
-	 * Sets the user remote service.
-	 *
-	 * @param userService the user remote service
-	 */
-	public void setUserService(
-		com.liferay.portal.service.UserService userService) {
-		this.userService = userService;
-	}
-
-	/**
-	 * Returns the user persistence.
-	 *
-	 * @return the user persistence
-	 */
-	public UserPersistence getUserPersistence() {
-		return userPersistence;
-	}
-
-	/**
-	 * Sets the user persistence.
-	 *
-	 * @param userPersistence the user persistence
-	 */
-	public void setUserPersistence(UserPersistence userPersistence) {
-		this.userPersistence = userPersistence;
-	}
-
-	public void afterPropertiesSet() {
-		Class<?> clazz = getClass();
-
-		_classLoader = clazz.getClassLoader();
-
-		PersistedModelLocalServiceRegistryUtil.register("com.liferay.marketplace.model.App",
-			appLocalService);
-	}
-
-	public void destroy() {
-		PersistedModelLocalServiceRegistryUtil.unregister(
-			"com.liferay.marketplace.model.App");
-	}
-
-	/**
-	 * Returns the Spring bean ID for this bean.
-	 *
-	 * @return the Spring bean ID for this bean
-	 */
-	@Override
-	public String getBeanIdentifier() {
-		return _beanIdentifier;
-	}
-
-	/**
-	 * Sets the Spring bean ID for this bean.
-	 *
-	 * @param beanIdentifier the Spring bean ID for this bean
-	 */
-	@Override
-	public void setBeanIdentifier(String beanIdentifier) {
-		_beanIdentifier = beanIdentifier;
-	}
-
-	@Override
-	public Object invokeMethod(String name, String[] parameterTypes,
-		Object[] arguments) throws Throwable {
-		Thread currentThread = Thread.currentThread();
-
-		ClassLoader contextClassLoader = currentThread.getContextClassLoader();
-
-		if (contextClassLoader != _classLoader) {
-			currentThread.setContextClassLoader(_classLoader);
-		}
-
-		try {
-			return _clpInvoker.invokeMethod(name, parameterTypes, arguments);
-		}
-		finally {
-			if (contextClassLoader != _classLoader) {
-				currentThread.setContextClassLoader(contextClassLoader);
-			}
-		}
-	}
-
-	protected Class<?> getModelClass() {
-		return App.class;
-	}
-
-	protected String getModelClassName() {
-		return App.class.getName();
-	}
-
-	/**
-	 * Performs an SQL query.
-	 *
-	 * @param sql the sql query
-	 */
-	protected void runSQL(String sql) throws SystemException {
-		try {
-			DataSource dataSource = appPersistence.getDataSource();
-
-			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
-					sql, new int[0]);
-
-			sqlUpdate.update();
-		}
-		catch (Exception e) {
-			throw new SystemException(e);
-		}
-	}
-
-	@BeanReference(type = com.liferay.marketplace.service.AppLocalService.class)
-	protected com.liferay.marketplace.service.AppLocalService appLocalService;
-	@BeanReference(type = com.liferay.marketplace.service.AppService.class)
-	protected com.liferay.marketplace.service.AppService appService;
-	@BeanReference(type = AppPersistence.class)
-	protected AppPersistence appPersistence;
-	@BeanReference(type = com.liferay.marketplace.service.ModuleLocalService.class)
-	protected com.liferay.marketplace.service.ModuleLocalService moduleLocalService;
-	@BeanReference(type = ModulePersistence.class)
-	protected ModulePersistence modulePersistence;
-	@BeanReference(type = com.liferay.counter.service.CounterLocalService.class)
-	protected com.liferay.counter.service.CounterLocalService counterLocalService;
-	@BeanReference(type = com.liferay.portal.service.ResourceLocalService.class)
-	protected com.liferay.portal.service.ResourceLocalService resourceLocalService;
-	@BeanReference(type = com.liferay.portal.service.UserLocalService.class)
-	protected com.liferay.portal.service.UserLocalService userLocalService;
-	@BeanReference(type = com.liferay.portal.service.UserService.class)
-	protected com.liferay.portal.service.UserService userService;
-	@BeanReference(type = UserPersistence.class)
-	protected UserPersistence userPersistence;
-	private String _beanIdentifier;
-	private ClassLoader _classLoader;
-	private AppLocalServiceClpInvoker _clpInvoker = new AppLocalServiceClpInvoker();
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppLocalServiceClpInvoker.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppLocalServiceClpInvoker.java
deleted file mode 100644
index 0b5dc9f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppLocalServiceClpInvoker.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.base;
-
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-
-import java.util.Arrays;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class AppLocalServiceClpInvoker {
-	public AppLocalServiceClpInvoker() {
-		_methodName0 = "addApp";
-
-		_methodParameterTypes0 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName1 = "createApp";
-
-		_methodParameterTypes1 = new String[] { "long" };
-
-		_methodName2 = "deleteApp";
-
-		_methodParameterTypes2 = new String[] { "long" };
-
-		_methodName3 = "deleteApp";
-
-		_methodParameterTypes3 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName4 = "dynamicQuery";
-
-		_methodParameterTypes4 = new String[] {  };
-
-		_methodName5 = "dynamicQuery";
-
-		_methodParameterTypes5 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName6 = "dynamicQuery";
-
-		_methodParameterTypes6 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int"
-			};
-
-		_methodName7 = "dynamicQuery";
-
-		_methodParameterTypes7 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int",
-				"com.liferay.portal.kernel.util.OrderByComparator"
-			};
-
-		_methodName8 = "dynamicQueryCount";
-
-		_methodParameterTypes8 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName9 = "dynamicQueryCount";
-
-		_methodParameterTypes9 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery",
-				"com.liferay.portal.kernel.dao.orm.Projection"
-			};
-
-		_methodName10 = "fetchApp";
-
-		_methodParameterTypes10 = new String[] { "long" };
-
-		_methodName11 = "fetchAppByUuidAndCompanyId";
-
-		_methodParameterTypes11 = new String[] { "java.lang.String", "long" };
-
-		_methodName12 = "getApp";
-
-		_methodParameterTypes12 = new String[] { "long" };
-
-		_methodName13 = "getPersistedModel";
-
-		_methodParameterTypes13 = new String[] { "java.io.Serializable" };
-
-		_methodName14 = "getAppByUuidAndCompanyId";
-
-		_methodParameterTypes14 = new String[] { "java.lang.String", "long" };
-
-		_methodName15 = "getApps";
-
-		_methodParameterTypes15 = new String[] { "int", "int" };
-
-		_methodName16 = "getAppsCount";
-
-		_methodParameterTypes16 = new String[] {  };
-
-		_methodName17 = "updateApp";
-
-		_methodParameterTypes17 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName40 = "getBeanIdentifier";
-
-		_methodParameterTypes40 = new String[] {  };
-
-		_methodName41 = "setBeanIdentifier";
-
-		_methodParameterTypes41 = new String[] { "java.lang.String" };
-
-		_methodName46 = "clearInstalledAppsCache";
-
-		_methodParameterTypes46 = new String[] {  };
-
-		_methodName47 = "deleteApp";
-
-		_methodParameterTypes47 = new String[] {
-				"com.liferay.marketplace.model.App"
-			};
-
-		_methodName48 = "deleteApp";
-
-		_methodParameterTypes48 = new String[] { "long" };
-
-		_methodName49 = "fetchRemoteApp";
-
-		_methodParameterTypes49 = new String[] { "long" };
-
-		_methodName50 = "getApps";
-
-		_methodParameterTypes50 = new String[] { "java.lang.String" };
-
-		_methodName51 = "getBundledApps";
-
-		_methodParameterTypes51 = new String[] {  };
-
-		_methodName52 = "getInstalledApps";
-
-		_methodParameterTypes52 = new String[] {  };
-
-		_methodName53 = "installApp";
-
-		_methodParameterTypes53 = new String[] { "long" };
-
-		_methodName54 = "processMarketplaceProperties";
-
-		_methodParameterTypes54 = new String[] { "java.util.Properties" };
-
-		_methodName55 = "uninstallApp";
-
-		_methodParameterTypes55 = new String[] { "long" };
-
-		_methodName56 = "updateApp";
-
-		_methodParameterTypes56 = new String[] {
-				"long", "long", "java.lang.String", "java.io.File"
-			};
-
-		_methodName57 = "updateApp";
-
-		_methodParameterTypes57 = new String[] {
-				"long", "long", "java.lang.String", "java.lang.String",
-				"java.lang.String", "java.lang.String", "java.lang.String",
-				"java.io.File"
-			};
-	}
-
-	public Object invokeMethod(String name, String[] parameterTypes,
-		Object[] arguments) throws Throwable {
-		if (_methodName0.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes0, parameterTypes)) {
-			return AppLocalServiceUtil.addApp((com.liferay.marketplace.model.App)arguments[0]);
-		}
-
-		if (_methodName1.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes1, parameterTypes)) {
-			return AppLocalServiceUtil.createApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName2.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes2, parameterTypes)) {
-			return AppLocalServiceUtil.deleteApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName3.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes3, parameterTypes)) {
-			return AppLocalServiceUtil.deleteApp((com.liferay.marketplace.model.App)arguments[0]);
-		}
-
-		if (_methodName4.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes4, parameterTypes)) {
-			return AppLocalServiceUtil.dynamicQuery();
-		}
-
-		if (_methodName5.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes5, parameterTypes)) {
-			return AppLocalServiceUtil.dynamicQuery((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0]);
-		}
-
-		if (_methodName6.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes6, parameterTypes)) {
-			return AppLocalServiceUtil.dynamicQuery((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0],
-				((Integer)arguments[1]).intValue(),
-				((Integer)arguments[2]).intValue());
-		}
-
-		if (_methodName7.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes7, parameterTypes)) {
-			return AppLocalServiceUtil.dynamicQuery((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0],
-				((Integer)arguments[1]).intValue(),
-				((Integer)arguments[2]).intValue(),
-				(com.liferay.portal.kernel.util.OrderByComparator)arguments[3]);
-		}
-
-		if (_methodName8.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes8, parameterTypes)) {
-			return AppLocalServiceUtil.dynamicQueryCount((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0]);
-		}
-
-		if (_methodName9.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes9, parameterTypes)) {
-			return AppLocalServiceUtil.dynamicQueryCount((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0],
-				(com.liferay.portal.kernel.dao.orm.Projection)arguments[1]);
-		}
-
-		if (_methodName10.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes10, parameterTypes)) {
-			return AppLocalServiceUtil.fetchApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName11.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes11, parameterTypes)) {
-			return AppLocalServiceUtil.fetchAppByUuidAndCompanyId((java.lang.String)arguments[0],
-				((Long)arguments[1]).longValue());
-		}
-
-		if (_methodName12.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes12, parameterTypes)) {
-			return AppLocalServiceUtil.getApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName13.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes13, parameterTypes)) {
-			return AppLocalServiceUtil.getPersistedModel((java.io.Serializable)arguments[0]);
-		}
-
-		if (_methodName14.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes14, parameterTypes)) {
-			return AppLocalServiceUtil.getAppByUuidAndCompanyId((java.lang.String)arguments[0],
-				((Long)arguments[1]).longValue());
-		}
-
-		if (_methodName15.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes15, parameterTypes)) {
-			return AppLocalServiceUtil.getApps(((Integer)arguments[0]).intValue(),
-				((Integer)arguments[1]).intValue());
-		}
-
-		if (_methodName16.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes16, parameterTypes)) {
-			return AppLocalServiceUtil.getAppsCount();
-		}
-
-		if (_methodName17.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes17, parameterTypes)) {
-			return AppLocalServiceUtil.updateApp((com.liferay.marketplace.model.App)arguments[0]);
-		}
-
-		if (_methodName40.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes40, parameterTypes)) {
-			return AppLocalServiceUtil.getBeanIdentifier();
-		}
-
-		if (_methodName41.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes41, parameterTypes)) {
-			AppLocalServiceUtil.setBeanIdentifier((java.lang.String)arguments[0]);
-
-			return null;
-		}
-
-		if (_methodName46.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes46, parameterTypes)) {
-			AppLocalServiceUtil.clearInstalledAppsCache();
-
-			return null;
-		}
-
-		if (_methodName47.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes47, parameterTypes)) {
-			return AppLocalServiceUtil.deleteApp((com.liferay.marketplace.model.App)arguments[0]);
-		}
-
-		if (_methodName48.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes48, parameterTypes)) {
-			return AppLocalServiceUtil.deleteApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName49.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes49, parameterTypes)) {
-			return AppLocalServiceUtil.fetchRemoteApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName50.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes50, parameterTypes)) {
-			return AppLocalServiceUtil.getApps((java.lang.String)arguments[0]);
-		}
-
-		if (_methodName51.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes51, parameterTypes)) {
-			return AppLocalServiceUtil.getBundledApps();
-		}
-
-		if (_methodName52.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes52, parameterTypes)) {
-			return AppLocalServiceUtil.getInstalledApps();
-		}
-
-		if (_methodName53.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes53, parameterTypes)) {
-			AppLocalServiceUtil.installApp(((Long)arguments[0]).longValue());
-
-			return null;
-		}
-
-		if (_methodName54.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes54, parameterTypes)) {
-			AppLocalServiceUtil.processMarketplaceProperties((java.util.Properties)arguments[0]);
-
-			return null;
-		}
-
-		if (_methodName55.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes55, parameterTypes)) {
-			AppLocalServiceUtil.uninstallApp(((Long)arguments[0]).longValue());
-
-			return null;
-		}
-
-		if (_methodName56.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes56, parameterTypes)) {
-			return AppLocalServiceUtil.updateApp(((Long)arguments[0]).longValue(),
-				((Long)arguments[1]).longValue(),
-				(java.lang.String)arguments[2], (java.io.File)arguments[3]);
-		}
-
-		if (_methodName57.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes57, parameterTypes)) {
-			return AppLocalServiceUtil.updateApp(((Long)arguments[0]).longValue(),
-				((Long)arguments[1]).longValue(),
-				(java.lang.String)arguments[2], (java.lang.String)arguments[3],
-				(java.lang.String)arguments[4], (java.lang.String)arguments[5],
-				(java.lang.String)arguments[6], (java.io.File)arguments[7]);
-		}
-
-		throw new UnsupportedOperationException();
-	}
-
-	private String _methodName0;
-	private String[] _methodParameterTypes0;
-	private String _methodName1;
-	private String[] _methodParameterTypes1;
-	private String _methodName2;
-	private String[] _methodParameterTypes2;
-	private String _methodName3;
-	private String[] _methodParameterTypes3;
-	private String _methodName4;
-	private String[] _methodParameterTypes4;
-	private String _methodName5;
-	private String[] _methodParameterTypes5;
-	private String _methodName6;
-	private String[] _methodParameterTypes6;
-	private String _methodName7;
-	private String[] _methodParameterTypes7;
-	private String _methodName8;
-	private String[] _methodParameterTypes8;
-	private String _methodName9;
-	private String[] _methodParameterTypes9;
-	private String _methodName10;
-	private String[] _methodParameterTypes10;
-	private String _methodName11;
-	private String[] _methodParameterTypes11;
-	private String _methodName12;
-	private String[] _methodParameterTypes12;
-	private String _methodName13;
-	private String[] _methodParameterTypes13;
-	private String _methodName14;
-	private String[] _methodParameterTypes14;
-	private String _methodName15;
-	private String[] _methodParameterTypes15;
-	private String _methodName16;
-	private String[] _methodParameterTypes16;
-	private String _methodName17;
-	private String[] _methodParameterTypes17;
-	private String _methodName40;
-	private String[] _methodParameterTypes40;
-	private String _methodName41;
-	private String[] _methodParameterTypes41;
-	private String _methodName46;
-	private String[] _methodParameterTypes46;
-	private String _methodName47;
-	private String[] _methodParameterTypes47;
-	private String _methodName48;
-	private String[] _methodParameterTypes48;
-	private String _methodName49;
-	private String[] _methodParameterTypes49;
-	private String _methodName50;
-	private String[] _methodParameterTypes50;
-	private String _methodName51;
-	private String[] _methodParameterTypes51;
-	private String _methodName52;
-	private String[] _methodParameterTypes52;
-	private String _methodName53;
-	private String[] _methodParameterTypes53;
-	private String _methodName54;
-	private String[] _methodParameterTypes54;
-	private String _methodName55;
-	private String[] _methodParameterTypes55;
-	private String _methodName56;
-	private String[] _methodParameterTypes56;
-	private String _methodName57;
-	private String[] _methodParameterTypes57;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppServiceBaseImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppServiceBaseImpl.java
deleted file mode 100644
index aab8196..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppServiceBaseImpl.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.base;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.AppService;
-import com.liferay.marketplace.service.persistence.AppPersistence;
-import com.liferay.marketplace.service.persistence.ModulePersistence;
-
-import com.liferay.portal.kernel.bean.BeanReference;
-import com.liferay.portal.kernel.bean.IdentifiableBean;
-import com.liferay.portal.kernel.dao.jdbc.SqlUpdate;
-import com.liferay.portal.kernel.dao.jdbc.SqlUpdateFactoryUtil;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.service.BaseServiceImpl;
-import com.liferay.portal.service.persistence.UserPersistence;
-
-import javax.sql.DataSource;
-
-/**
- * Provides the base implementation for the app remote service.
- *
- * <p>
- * This implementation exists only as a container for the default service methods generated by ServiceBuilder. All custom service methods should be put in {@link com.liferay.marketplace.service.impl.AppServiceImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see com.liferay.marketplace.service.impl.AppServiceImpl
- * @see com.liferay.marketplace.service.AppServiceUtil
- * @generated
- */
-public abstract class AppServiceBaseImpl extends BaseServiceImpl
-	implements AppService, IdentifiableBean {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. Always use {@link com.liferay.marketplace.service.AppServiceUtil} to access the app remote service.
-	 */
-
-	/**
-	 * Returns the app local service.
-	 *
-	 * @return the app local service
-	 */
-	public com.liferay.marketplace.service.AppLocalService getAppLocalService() {
-		return appLocalService;
-	}
-
-	/**
-	 * Sets the app local service.
-	 *
-	 * @param appLocalService the app local service
-	 */
-	public void setAppLocalService(
-		com.liferay.marketplace.service.AppLocalService appLocalService) {
-		this.appLocalService = appLocalService;
-	}
-
-	/**
-	 * Returns the app remote service.
-	 *
-	 * @return the app remote service
-	 */
-	public com.liferay.marketplace.service.AppService getAppService() {
-		return appService;
-	}
-
-	/**
-	 * Sets the app remote service.
-	 *
-	 * @param appService the app remote service
-	 */
-	public void setAppService(
-		com.liferay.marketplace.service.AppService appService) {
-		this.appService = appService;
-	}
-
-	/**
-	 * Returns the app persistence.
-	 *
-	 * @return the app persistence
-	 */
-	public AppPersistence getAppPersistence() {
-		return appPersistence;
-	}
-
-	/**
-	 * Sets the app persistence.
-	 *
-	 * @param appPersistence the app persistence
-	 */
-	public void setAppPersistence(AppPersistence appPersistence) {
-		this.appPersistence = appPersistence;
-	}
-
-	/**
-	 * Returns the module local service.
-	 *
-	 * @return the module local service
-	 */
-	public com.liferay.marketplace.service.ModuleLocalService getModuleLocalService() {
-		return moduleLocalService;
-	}
-
-	/**
-	 * Sets the module local service.
-	 *
-	 * @param moduleLocalService the module local service
-	 */
-	public void setModuleLocalService(
-		com.liferay.marketplace.service.ModuleLocalService moduleLocalService) {
-		this.moduleLocalService = moduleLocalService;
-	}
-
-	/**
-	 * Returns the module persistence.
-	 *
-	 * @return the module persistence
-	 */
-	public ModulePersistence getModulePersistence() {
-		return modulePersistence;
-	}
-
-	/**
-	 * Sets the module persistence.
-	 *
-	 * @param modulePersistence the module persistence
-	 */
-	public void setModulePersistence(ModulePersistence modulePersistence) {
-		this.modulePersistence = modulePersistence;
-	}
-
-	/**
-	 * Returns the counter local service.
-	 *
-	 * @return the counter local service
-	 */
-	public com.liferay.counter.service.CounterLocalService getCounterLocalService() {
-		return counterLocalService;
-	}
-
-	/**
-	 * Sets the counter local service.
-	 *
-	 * @param counterLocalService the counter local service
-	 */
-	public void setCounterLocalService(
-		com.liferay.counter.service.CounterLocalService counterLocalService) {
-		this.counterLocalService = counterLocalService;
-	}
-
-	/**
-	 * Returns the resource local service.
-	 *
-	 * @return the resource local service
-	 */
-	public com.liferay.portal.service.ResourceLocalService getResourceLocalService() {
-		return resourceLocalService;
-	}
-
-	/**
-	 * Sets the resource local service.
-	 *
-	 * @param resourceLocalService the resource local service
-	 */
-	public void setResourceLocalService(
-		com.liferay.portal.service.ResourceLocalService resourceLocalService) {
-		this.resourceLocalService = resourceLocalService;
-	}
-
-	/**
-	 * Returns the user local service.
-	 *
-	 * @return the user local service
-	 */
-	public com.liferay.portal.service.UserLocalService getUserLocalService() {
-		return userLocalService;
-	}
-
-	/**
-	 * Sets the user local service.
-	 *
-	 * @param userLocalService the user local service
-	 */
-	public void setUserLocalService(
-		com.liferay.portal.service.UserLocalService userLocalService) {
-		this.userLocalService = userLocalService;
-	}
-
-	/**
-	 * Returns the user remote service.
-	 *
-	 * @return the user remote service
-	 */
-	public com.liferay.portal.service.UserService getUserService() {
-		return userService;
-	}
-
-	/**
-	 * Sets the user remote service.
-	 *
-	 * @param userService the user remote service
-	 */
-	public void setUserService(
-		com.liferay.portal.service.UserService userService) {
-		this.userService = userService;
-	}
-
-	/**
-	 * Returns the user persistence.
-	 *
-	 * @return the user persistence
-	 */
-	public UserPersistence getUserPersistence() {
-		return userPersistence;
-	}
-
-	/**
-	 * Sets the user persistence.
-	 *
-	 * @param userPersistence the user persistence
-	 */
-	public void setUserPersistence(UserPersistence userPersistence) {
-		this.userPersistence = userPersistence;
-	}
-
-	public void afterPropertiesSet() {
-		Class<?> clazz = getClass();
-
-		_classLoader = clazz.getClassLoader();
-	}
-
-	public void destroy() {
-	}
-
-	/**
-	 * Returns the Spring bean ID for this bean.
-	 *
-	 * @return the Spring bean ID for this bean
-	 */
-	@Override
-	public String getBeanIdentifier() {
-		return _beanIdentifier;
-	}
-
-	/**
-	 * Sets the Spring bean ID for this bean.
-	 *
-	 * @param beanIdentifier the Spring bean ID for this bean
-	 */
-	@Override
-	public void setBeanIdentifier(String beanIdentifier) {
-		_beanIdentifier = beanIdentifier;
-	}
-
-	@Override
-	public Object invokeMethod(String name, String[] parameterTypes,
-		Object[] arguments) throws Throwable {
-		Thread currentThread = Thread.currentThread();
-
-		ClassLoader contextClassLoader = currentThread.getContextClassLoader();
-
-		if (contextClassLoader != _classLoader) {
-			currentThread.setContextClassLoader(_classLoader);
-		}
-
-		try {
-			return _clpInvoker.invokeMethod(name, parameterTypes, arguments);
-		}
-		finally {
-			if (contextClassLoader != _classLoader) {
-				currentThread.setContextClassLoader(contextClassLoader);
-			}
-		}
-	}
-
-	protected Class<?> getModelClass() {
-		return App.class;
-	}
-
-	protected String getModelClassName() {
-		return App.class.getName();
-	}
-
-	/**
-	 * Performs an SQL query.
-	 *
-	 * @param sql the sql query
-	 */
-	protected void runSQL(String sql) throws SystemException {
-		try {
-			DataSource dataSource = appPersistence.getDataSource();
-
-			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
-					sql, new int[0]);
-
-			sqlUpdate.update();
-		}
-		catch (Exception e) {
-			throw new SystemException(e);
-		}
-	}
-
-	@BeanReference(type = com.liferay.marketplace.service.AppLocalService.class)
-	protected com.liferay.marketplace.service.AppLocalService appLocalService;
-	@BeanReference(type = com.liferay.marketplace.service.AppService.class)
-	protected com.liferay.marketplace.service.AppService appService;
-	@BeanReference(type = AppPersistence.class)
-	protected AppPersistence appPersistence;
-	@BeanReference(type = com.liferay.marketplace.service.ModuleLocalService.class)
-	protected com.liferay.marketplace.service.ModuleLocalService moduleLocalService;
-	@BeanReference(type = ModulePersistence.class)
-	protected ModulePersistence modulePersistence;
-	@BeanReference(type = com.liferay.counter.service.CounterLocalService.class)
-	protected com.liferay.counter.service.CounterLocalService counterLocalService;
-	@BeanReference(type = com.liferay.portal.service.ResourceLocalService.class)
-	protected com.liferay.portal.service.ResourceLocalService resourceLocalService;
-	@BeanReference(type = com.liferay.portal.service.UserLocalService.class)
-	protected com.liferay.portal.service.UserLocalService userLocalService;
-	@BeanReference(type = com.liferay.portal.service.UserService.class)
-	protected com.liferay.portal.service.UserService userService;
-	@BeanReference(type = UserPersistence.class)
-	protected UserPersistence userPersistence;
-	private String _beanIdentifier;
-	private ClassLoader _classLoader;
-	private AppServiceClpInvoker _clpInvoker = new AppServiceClpInvoker();
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppServiceClpInvoker.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppServiceClpInvoker.java
deleted file mode 100644
index d618935..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/AppServiceClpInvoker.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.base;
-
-import com.liferay.marketplace.service.AppServiceUtil;
-
-import java.util.Arrays;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class AppServiceClpInvoker {
-	public AppServiceClpInvoker() {
-		_methodName22 = "getBeanIdentifier";
-
-		_methodParameterTypes22 = new String[] {  };
-
-		_methodName23 = "setBeanIdentifier";
-
-		_methodParameterTypes23 = new String[] { "java.lang.String" };
-
-		_methodName28 = "deleteApp";
-
-		_methodParameterTypes28 = new String[] { "long" };
-
-		_methodName29 = "installApp";
-
-		_methodParameterTypes29 = new String[] { "long" };
-
-		_methodName30 = "uninstallApp";
-
-		_methodParameterTypes30 = new String[] { "long" };
-
-		_methodName31 = "updateApp";
-
-		_methodParameterTypes31 = new String[] {
-				"long", "java.lang.String", "java.io.File"
-			};
-	}
-
-	public Object invokeMethod(String name, String[] parameterTypes,
-		Object[] arguments) throws Throwable {
-		if (_methodName22.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes22, parameterTypes)) {
-			return AppServiceUtil.getBeanIdentifier();
-		}
-
-		if (_methodName23.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes23, parameterTypes)) {
-			AppServiceUtil.setBeanIdentifier((java.lang.String)arguments[0]);
-
-			return null;
-		}
-
-		if (_methodName28.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes28, parameterTypes)) {
-			return AppServiceUtil.deleteApp(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName29.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes29, parameterTypes)) {
-			AppServiceUtil.installApp(((Long)arguments[0]).longValue());
-
-			return null;
-		}
-
-		if (_methodName30.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes30, parameterTypes)) {
-			AppServiceUtil.uninstallApp(((Long)arguments[0]).longValue());
-
-			return null;
-		}
-
-		if (_methodName31.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes31, parameterTypes)) {
-			return AppServiceUtil.updateApp(((Long)arguments[0]).longValue(),
-				(java.lang.String)arguments[1], (java.io.File)arguments[2]);
-		}
-
-		throw new UnsupportedOperationException();
-	}
-
-	private String _methodName22;
-	private String[] _methodParameterTypes22;
-	private String _methodName23;
-	private String[] _methodParameterTypes23;
-	private String _methodName28;
-	private String[] _methodParameterTypes28;
-	private String _methodName29;
-	private String[] _methodParameterTypes29;
-	private String _methodName30;
-	private String[] _methodParameterTypes30;
-	private String _methodName31;
-	private String[] _methodParameterTypes31;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/ModuleLocalServiceBaseImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/ModuleLocalServiceBaseImpl.java
deleted file mode 100644
index 91f3921..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/ModuleLocalServiceBaseImpl.java
+++ /dev/null
@@ -1,569 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.base;
-
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.service.ModuleLocalService;
-import com.liferay.marketplace.service.persistence.AppPersistence;
-import com.liferay.marketplace.service.persistence.ModulePersistence;
-
-import com.liferay.portal.kernel.bean.BeanReference;
-import com.liferay.portal.kernel.bean.IdentifiableBean;
-import com.liferay.portal.kernel.dao.jdbc.SqlUpdate;
-import com.liferay.portal.kernel.dao.jdbc.SqlUpdateFactoryUtil;
-import com.liferay.portal.kernel.dao.orm.DynamicQuery;
-import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
-import com.liferay.portal.kernel.dao.orm.Projection;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.search.Indexable;
-import com.liferay.portal.kernel.search.IndexableType;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.model.PersistedModel;
-import com.liferay.portal.service.BaseLocalServiceImpl;
-import com.liferay.portal.service.PersistedModelLocalServiceRegistryUtil;
-import com.liferay.portal.service.persistence.UserPersistence;
-
-import java.io.Serializable;
-
-import java.util.List;
-
-import javax.sql.DataSource;
-
-/**
- * Provides the base implementation for the module local service.
- *
- * <p>
- * This implementation exists only as a container for the default service methods generated by ServiceBuilder. All custom service methods should be put in {@link com.liferay.marketplace.service.impl.ModuleLocalServiceImpl}.
- * </p>
- *
- * @author Ryan Park
- * @see com.liferay.marketplace.service.impl.ModuleLocalServiceImpl
- * @see com.liferay.marketplace.service.ModuleLocalServiceUtil
- * @generated
- */
-public abstract class ModuleLocalServiceBaseImpl extends BaseLocalServiceImpl
-	implements ModuleLocalService, IdentifiableBean {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. Always use {@link com.liferay.marketplace.service.ModuleLocalServiceUtil} to access the module local service.
-	 */
-
-	/**
-	 * Adds the module to the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param module the module
-	 * @return the module that was added
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.REINDEX)
-	@Override
-	public Module addModule(Module module) throws SystemException {
-		module.setNew(true);
-
-		return modulePersistence.update(module);
-	}
-
-	/**
-	 * Creates a new module with the primary key. Does not add the module to the database.
-	 *
-	 * @param moduleId the primary key for the new module
-	 * @return the new module
-	 */
-	@Override
-	public Module createModule(long moduleId) {
-		return modulePersistence.create(moduleId);
-	}
-
-	/**
-	 * Deletes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param moduleId the primary key of the module
-	 * @return the module that was removed
-	 * @throws PortalException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.DELETE)
-	@Override
-	public Module deleteModule(long moduleId)
-		throws PortalException, SystemException {
-		return modulePersistence.remove(moduleId);
-	}
-
-	/**
-	 * Deletes the module from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param module the module
-	 * @return the module that was removed
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.DELETE)
-	@Override
-	public Module deleteModule(Module module) throws SystemException {
-		return modulePersistence.remove(module);
-	}
-
-	@Override
-	public DynamicQuery dynamicQuery() {
-		Class<?> clazz = getClass();
-
-		return DynamicQueryFactoryUtil.forClass(Module.class,
-			clazz.getClassLoader());
-	}
-
-	/**
-	 * Performs a dynamic query on the database and returns the matching rows.
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @return the matching rows
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	@SuppressWarnings("rawtypes")
-	public List dynamicQuery(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return modulePersistence.findWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * Performs a dynamic query on the database and returns a range of the matching rows.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @param start the lower bound of the range of model instances
-	 * @param end the upper bound of the range of model instances (not inclusive)
-	 * @return the range of matching rows
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	@SuppressWarnings("rawtypes")
-	public List dynamicQuery(DynamicQuery dynamicQuery, int start, int end)
-		throws SystemException {
-		return modulePersistence.findWithDynamicQuery(dynamicQuery, start, end);
-	}
-
-	/**
-	 * Performs a dynamic query on the database and returns an ordered range of the matching rows.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @param start the lower bound of the range of model instances
-	 * @param end the upper bound of the range of model instances (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching rows
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	@SuppressWarnings("rawtypes")
-	public List dynamicQuery(DynamicQuery dynamicQuery, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		return modulePersistence.findWithDynamicQuery(dynamicQuery, start, end,
-			orderByComparator);
-	}
-
-	/**
-	 * Returns the number of rows that match the dynamic query.
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @return the number of rows that match the dynamic query
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public long dynamicQueryCount(DynamicQuery dynamicQuery)
-		throws SystemException {
-		return modulePersistence.countWithDynamicQuery(dynamicQuery);
-	}
-
-	/**
-	 * Returns the number of rows that match the dynamic query.
-	 *
-	 * @param dynamicQuery the dynamic query
-	 * @param projection the projection to apply to the query
-	 * @return the number of rows that match the dynamic query
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public long dynamicQueryCount(DynamicQuery dynamicQuery,
-		Projection projection) throws SystemException {
-		return modulePersistence.countWithDynamicQuery(dynamicQuery, projection);
-	}
-
-	@Override
-	public Module fetchModule(long moduleId) throws SystemException {
-		return modulePersistence.fetchByPrimaryKey(moduleId);
-	}
-
-	/**
-	 * Returns the module with the primary key.
-	 *
-	 * @param moduleId the primary key of the module
-	 * @return the module
-	 * @throws PortalException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module getModule(long moduleId)
-		throws PortalException, SystemException {
-		return modulePersistence.findByPrimaryKey(moduleId);
-	}
-
-	@Override
-	public PersistedModel getPersistedModel(Serializable primaryKeyObj)
-		throws PortalException, SystemException {
-		return modulePersistence.findByPrimaryKey(primaryKeyObj);
-	}
-
-	/**
-	 * Returns a range of all the modules.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @return the range of modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> getModules(int start, int end)
-		throws SystemException {
-		return modulePersistence.findAll(start, end);
-	}
-
-	/**
-	 * Returns the number of modules.
-	 *
-	 * @return the number of modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int getModulesCount() throws SystemException {
-		return modulePersistence.countAll();
-	}
-
-	/**
-	 * Updates the module in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
-	 *
-	 * @param module the module
-	 * @return the module that was updated
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Indexable(type = IndexableType.REINDEX)
-	@Override
-	public Module updateModule(Module module) throws SystemException {
-		return modulePersistence.update(module);
-	}
-
-	/**
-	 * Returns the app local service.
-	 *
-	 * @return the app local service
-	 */
-	public com.liferay.marketplace.service.AppLocalService getAppLocalService() {
-		return appLocalService;
-	}
-
-	/**
-	 * Sets the app local service.
-	 *
-	 * @param appLocalService the app local service
-	 */
-	public void setAppLocalService(
-		com.liferay.marketplace.service.AppLocalService appLocalService) {
-		this.appLocalService = appLocalService;
-	}
-
-	/**
-	 * Returns the app remote service.
-	 *
-	 * @return the app remote service
-	 */
-	public com.liferay.marketplace.service.AppService getAppService() {
-		return appService;
-	}
-
-	/**
-	 * Sets the app remote service.
-	 *
-	 * @param appService the app remote service
-	 */
-	public void setAppService(
-		com.liferay.marketplace.service.AppService appService) {
-		this.appService = appService;
-	}
-
-	/**
-	 * Returns the app persistence.
-	 *
-	 * @return the app persistence
-	 */
-	public AppPersistence getAppPersistence() {
-		return appPersistence;
-	}
-
-	/**
-	 * Sets the app persistence.
-	 *
-	 * @param appPersistence the app persistence
-	 */
-	public void setAppPersistence(AppPersistence appPersistence) {
-		this.appPersistence = appPersistence;
-	}
-
-	/**
-	 * Returns the module local service.
-	 *
-	 * @return the module local service
-	 */
-	public com.liferay.marketplace.service.ModuleLocalService getModuleLocalService() {
-		return moduleLocalService;
-	}
-
-	/**
-	 * Sets the module local service.
-	 *
-	 * @param moduleLocalService the module local service
-	 */
-	public void setModuleLocalService(
-		com.liferay.marketplace.service.ModuleLocalService moduleLocalService) {
-		this.moduleLocalService = moduleLocalService;
-	}
-
-	/**
-	 * Returns the module persistence.
-	 *
-	 * @return the module persistence
-	 */
-	public ModulePersistence getModulePersistence() {
-		return modulePersistence;
-	}
-
-	/**
-	 * Sets the module persistence.
-	 *
-	 * @param modulePersistence the module persistence
-	 */
-	public void setModulePersistence(ModulePersistence modulePersistence) {
-		this.modulePersistence = modulePersistence;
-	}
-
-	/**
-	 * Returns the counter local service.
-	 *
-	 * @return the counter local service
-	 */
-	public com.liferay.counter.service.CounterLocalService getCounterLocalService() {
-		return counterLocalService;
-	}
-
-	/**
-	 * Sets the counter local service.
-	 *
-	 * @param counterLocalService the counter local service
-	 */
-	public void setCounterLocalService(
-		com.liferay.counter.service.CounterLocalService counterLocalService) {
-		this.counterLocalService = counterLocalService;
-	}
-
-	/**
-	 * Returns the resource local service.
-	 *
-	 * @return the resource local service
-	 */
-	public com.liferay.portal.service.ResourceLocalService getResourceLocalService() {
-		return resourceLocalService;
-	}
-
-	/**
-	 * Sets the resource local service.
-	 *
-	 * @param resourceLocalService the resource local service
-	 */
-	public void setResourceLocalService(
-		com.liferay.portal.service.ResourceLocalService resourceLocalService) {
-		this.resourceLocalService = resourceLocalService;
-	}
-
-	/**
-	 * Returns the user local service.
-	 *
-	 * @return the user local service
-	 */
-	public com.liferay.portal.service.UserLocalService getUserLocalService() {
-		return userLocalService;
-	}
-
-	/**
-	 * Sets the user local service.
-	 *
-	 * @param userLocalService the user local service
-	 */
-	public void setUserLocalService(
-		com.liferay.portal.service.UserLocalService userLocalService) {
-		this.userLocalService = userLocalService;
-	}
-
-	/**
-	 * Returns the user remote service.
-	 *
-	 * @return the user remote service
-	 */
-	public com.liferay.portal.service.UserService getUserService() {
-		return userService;
-	}
-
-	/**
-	 * Sets the user remote service.
-	 *
-	 * @param userService the user remote service
-	 */
-	public void setUserService(
-		com.liferay.portal.service.UserService userService) {
-		this.userService = userService;
-	}
-
-	/**
-	 * Returns the user persistence.
-	 *
-	 * @return the user persistence
-	 */
-	public UserPersistence getUserPersistence() {
-		return userPersistence;
-	}
-
-	/**
-	 * Sets the user persistence.
-	 *
-	 * @param userPersistence the user persistence
-	 */
-	public void setUserPersistence(UserPersistence userPersistence) {
-		this.userPersistence = userPersistence;
-	}
-
-	public void afterPropertiesSet() {
-		Class<?> clazz = getClass();
-
-		_classLoader = clazz.getClassLoader();
-
-		PersistedModelLocalServiceRegistryUtil.register("com.liferay.marketplace.model.Module",
-			moduleLocalService);
-	}
-
-	public void destroy() {
-		PersistedModelLocalServiceRegistryUtil.unregister(
-			"com.liferay.marketplace.model.Module");
-	}
-
-	/**
-	 * Returns the Spring bean ID for this bean.
-	 *
-	 * @return the Spring bean ID for this bean
-	 */
-	@Override
-	public String getBeanIdentifier() {
-		return _beanIdentifier;
-	}
-
-	/**
-	 * Sets the Spring bean ID for this bean.
-	 *
-	 * @param beanIdentifier the Spring bean ID for this bean
-	 */
-	@Override
-	public void setBeanIdentifier(String beanIdentifier) {
-		_beanIdentifier = beanIdentifier;
-	}
-
-	@Override
-	public Object invokeMethod(String name, String[] parameterTypes,
-		Object[] arguments) throws Throwable {
-		Thread currentThread = Thread.currentThread();
-
-		ClassLoader contextClassLoader = currentThread.getContextClassLoader();
-
-		if (contextClassLoader != _classLoader) {
-			currentThread.setContextClassLoader(_classLoader);
-		}
-
-		try {
-			return _clpInvoker.invokeMethod(name, parameterTypes, arguments);
-		}
-		finally {
-			if (contextClassLoader != _classLoader) {
-				currentThread.setContextClassLoader(contextClassLoader);
-			}
-		}
-	}
-
-	protected Class<?> getModelClass() {
-		return Module.class;
-	}
-
-	protected String getModelClassName() {
-		return Module.class.getName();
-	}
-
-	/**
-	 * Performs an SQL query.
-	 *
-	 * @param sql the sql query
-	 */
-	protected void runSQL(String sql) throws SystemException {
-		try {
-			DataSource dataSource = modulePersistence.getDataSource();
-
-			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
-					sql, new int[0]);
-
-			sqlUpdate.update();
-		}
-		catch (Exception e) {
-			throw new SystemException(e);
-		}
-	}
-
-	@BeanReference(type = com.liferay.marketplace.service.AppLocalService.class)
-	protected com.liferay.marketplace.service.AppLocalService appLocalService;
-	@BeanReference(type = com.liferay.marketplace.service.AppService.class)
-	protected com.liferay.marketplace.service.AppService appService;
-	@BeanReference(type = AppPersistence.class)
-	protected AppPersistence appPersistence;
-	@BeanReference(type = com.liferay.marketplace.service.ModuleLocalService.class)
-	protected com.liferay.marketplace.service.ModuleLocalService moduleLocalService;
-	@BeanReference(type = ModulePersistence.class)
-	protected ModulePersistence modulePersistence;
-	@BeanReference(type = com.liferay.counter.service.CounterLocalService.class)
-	protected com.liferay.counter.service.CounterLocalService counterLocalService;
-	@BeanReference(type = com.liferay.portal.service.ResourceLocalService.class)
-	protected com.liferay.portal.service.ResourceLocalService resourceLocalService;
-	@BeanReference(type = com.liferay.portal.service.UserLocalService.class)
-	protected com.liferay.portal.service.UserLocalService userLocalService;
-	@BeanReference(type = com.liferay.portal.service.UserService.class)
-	protected com.liferay.portal.service.UserService userService;
-	@BeanReference(type = UserPersistence.class)
-	protected UserPersistence userPersistence;
-	private String _beanIdentifier;
-	private ClassLoader _classLoader;
-	private ModuleLocalServiceClpInvoker _clpInvoker = new ModuleLocalServiceClpInvoker();
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/ModuleLocalServiceClpInvoker.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/ModuleLocalServiceClpInvoker.java
deleted file mode 100644
index 987fc8a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/base/ModuleLocalServiceClpInvoker.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.base;
-
-import com.liferay.marketplace.service.ModuleLocalServiceUtil;
-
-import java.util.Arrays;
-
-/**
- * @author Ryan Park
- * @generated
- */
-public class ModuleLocalServiceClpInvoker {
-	public ModuleLocalServiceClpInvoker() {
-		_methodName0 = "addModule";
-
-		_methodParameterTypes0 = new String[] {
-				"com.liferay.marketplace.model.Module"
-			};
-
-		_methodName1 = "createModule";
-
-		_methodParameterTypes1 = new String[] { "long" };
-
-		_methodName2 = "deleteModule";
-
-		_methodParameterTypes2 = new String[] { "long" };
-
-		_methodName3 = "deleteModule";
-
-		_methodParameterTypes3 = new String[] {
-				"com.liferay.marketplace.model.Module"
-			};
-
-		_methodName4 = "dynamicQuery";
-
-		_methodParameterTypes4 = new String[] {  };
-
-		_methodName5 = "dynamicQuery";
-
-		_methodParameterTypes5 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName6 = "dynamicQuery";
-
-		_methodParameterTypes6 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int"
-			};
-
-		_methodName7 = "dynamicQuery";
-
-		_methodParameterTypes7 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery", "int", "int",
-				"com.liferay.portal.kernel.util.OrderByComparator"
-			};
-
-		_methodName8 = "dynamicQueryCount";
-
-		_methodParameterTypes8 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery"
-			};
-
-		_methodName9 = "dynamicQueryCount";
-
-		_methodParameterTypes9 = new String[] {
-				"com.liferay.portal.kernel.dao.orm.DynamicQuery",
-				"com.liferay.portal.kernel.dao.orm.Projection"
-			};
-
-		_methodName10 = "fetchModule";
-
-		_methodParameterTypes10 = new String[] { "long" };
-
-		_methodName11 = "getModule";
-
-		_methodParameterTypes11 = new String[] { "long" };
-
-		_methodName12 = "getPersistedModel";
-
-		_methodParameterTypes12 = new String[] { "java.io.Serializable" };
-
-		_methodName13 = "getModules";
-
-		_methodParameterTypes13 = new String[] { "int", "int" };
-
-		_methodName14 = "getModulesCount";
-
-		_methodParameterTypes14 = new String[] {  };
-
-		_methodName15 = "updateModule";
-
-		_methodParameterTypes15 = new String[] {
-				"com.liferay.marketplace.model.Module"
-			};
-
-		_methodName38 = "getBeanIdentifier";
-
-		_methodParameterTypes38 = new String[] {  };
-
-		_methodName39 = "setBeanIdentifier";
-
-		_methodParameterTypes39 = new String[] { "java.lang.String" };
-
-		_methodName44 = "addModule";
-
-		_methodParameterTypes44 = new String[] {
-				"long", "long", "java.lang.String"
-			};
-
-		_methodName45 = "fetchModule";
-
-		_methodParameterTypes45 = new String[] { "long", "java.lang.String" };
-
-		_methodName46 = "getModules";
-
-		_methodParameterTypes46 = new String[] { "long" };
-	}
-
-	public Object invokeMethod(String name, String[] parameterTypes,
-		Object[] arguments) throws Throwable {
-		if (_methodName0.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes0, parameterTypes)) {
-			return ModuleLocalServiceUtil.addModule((com.liferay.marketplace.model.Module)arguments[0]);
-		}
-
-		if (_methodName1.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes1, parameterTypes)) {
-			return ModuleLocalServiceUtil.createModule(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName2.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes2, parameterTypes)) {
-			return ModuleLocalServiceUtil.deleteModule(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName3.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes3, parameterTypes)) {
-			return ModuleLocalServiceUtil.deleteModule((com.liferay.marketplace.model.Module)arguments[0]);
-		}
-
-		if (_methodName4.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes4, parameterTypes)) {
-			return ModuleLocalServiceUtil.dynamicQuery();
-		}
-
-		if (_methodName5.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes5, parameterTypes)) {
-			return ModuleLocalServiceUtil.dynamicQuery((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0]);
-		}
-
-		if (_methodName6.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes6, parameterTypes)) {
-			return ModuleLocalServiceUtil.dynamicQuery((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0],
-				((Integer)arguments[1]).intValue(),
-				((Integer)arguments[2]).intValue());
-		}
-
-		if (_methodName7.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes7, parameterTypes)) {
-			return ModuleLocalServiceUtil.dynamicQuery((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0],
-				((Integer)arguments[1]).intValue(),
-				((Integer)arguments[2]).intValue(),
-				(com.liferay.portal.kernel.util.OrderByComparator)arguments[3]);
-		}
-
-		if (_methodName8.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes8, parameterTypes)) {
-			return ModuleLocalServiceUtil.dynamicQueryCount((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0]);
-		}
-
-		if (_methodName9.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes9, parameterTypes)) {
-			return ModuleLocalServiceUtil.dynamicQueryCount((com.liferay.portal.kernel.dao.orm.DynamicQuery)arguments[0],
-				(com.liferay.portal.kernel.dao.orm.Projection)arguments[1]);
-		}
-
-		if (_methodName10.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes10, parameterTypes)) {
-			return ModuleLocalServiceUtil.fetchModule(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName11.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes11, parameterTypes)) {
-			return ModuleLocalServiceUtil.getModule(((Long)arguments[0]).longValue());
-		}
-
-		if (_methodName12.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes12, parameterTypes)) {
-			return ModuleLocalServiceUtil.getPersistedModel((java.io.Serializable)arguments[0]);
-		}
-
-		if (_methodName13.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes13, parameterTypes)) {
-			return ModuleLocalServiceUtil.getModules(((Integer)arguments[0]).intValue(),
-				((Integer)arguments[1]).intValue());
-		}
-
-		if (_methodName14.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes14, parameterTypes)) {
-			return ModuleLocalServiceUtil.getModulesCount();
-		}
-
-		if (_methodName15.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes15, parameterTypes)) {
-			return ModuleLocalServiceUtil.updateModule((com.liferay.marketplace.model.Module)arguments[0]);
-		}
-
-		if (_methodName38.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes38, parameterTypes)) {
-			return ModuleLocalServiceUtil.getBeanIdentifier();
-		}
-
-		if (_methodName39.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes39, parameterTypes)) {
-			ModuleLocalServiceUtil.setBeanIdentifier((java.lang.String)arguments[0]);
-
-			return null;
-		}
-
-		if (_methodName44.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes44, parameterTypes)) {
-			return ModuleLocalServiceUtil.addModule(((Long)arguments[0]).longValue(),
-				((Long)arguments[1]).longValue(), (java.lang.String)arguments[2]);
-		}
-
-		if (_methodName45.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes45, parameterTypes)) {
-			return ModuleLocalServiceUtil.fetchModule(((Long)arguments[0]).longValue(),
-				(java.lang.String)arguments[1]);
-		}
-
-		if (_methodName46.equals(name) &&
-				Arrays.deepEquals(_methodParameterTypes46, parameterTypes)) {
-			return ModuleLocalServiceUtil.getModules(((Long)arguments[0]).longValue());
-		}
-
-		throw new UnsupportedOperationException();
-	}
-
-	private String _methodName0;
-	private String[] _methodParameterTypes0;
-	private String _methodName1;
-	private String[] _methodParameterTypes1;
-	private String _methodName2;
-	private String[] _methodParameterTypes2;
-	private String _methodName3;
-	private String[] _methodParameterTypes3;
-	private String _methodName4;
-	private String[] _methodParameterTypes4;
-	private String _methodName5;
-	private String[] _methodParameterTypes5;
-	private String _methodName6;
-	private String[] _methodParameterTypes6;
-	private String _methodName7;
-	private String[] _methodParameterTypes7;
-	private String _methodName8;
-	private String[] _methodParameterTypes8;
-	private String _methodName9;
-	private String[] _methodParameterTypes9;
-	private String _methodName10;
-	private String[] _methodParameterTypes10;
-	private String _methodName11;
-	private String[] _methodParameterTypes11;
-	private String _methodName12;
-	private String[] _methodParameterTypes12;
-	private String _methodName13;
-	private String[] _methodParameterTypes13;
-	private String _methodName14;
-	private String[] _methodParameterTypes14;
-	private String _methodName15;
-	private String[] _methodParameterTypes15;
-	private String _methodName38;
-	private String[] _methodParameterTypes38;
-	private String _methodName39;
-	private String[] _methodParameterTypes39;
-	private String _methodName44;
-	private String[] _methodParameterTypes44;
-	private String _methodName45;
-	private String[] _methodParameterTypes45;
-	private String _methodName46;
-	private String[] _methodParameterTypes46;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/http/AppServiceSoap.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/http/AppServiceSoap.java
deleted file mode 100644
index ed42f5c..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/http/AppServiceSoap.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.http;
-
-import com.liferay.marketplace.service.AppServiceUtil;
-
-import com.liferay.portal.kernel.log.Log;
-import com.liferay.portal.kernel.log.LogFactoryUtil;
-
-import java.rmi.RemoteException;
-
-/**
- * Provides the SOAP utility for the
- * {@link com.liferay.marketplace.service.AppServiceUtil} service utility. The
- * static methods of this class calls the same methods of the service utility.
- * However, the signatures are different because it is difficult for SOAP to
- * support certain types.
- *
- * <p>
- * ServiceBuilder follows certain rules in translating the methods. For example,
- * if the method in the service utility returns a {@link java.util.List}, that
- * is translated to an array of {@link com.liferay.marketplace.model.AppSoap}.
- * If the method in the service utility returns a
- * {@link com.liferay.marketplace.model.App}, that is translated to a
- * {@link com.liferay.marketplace.model.AppSoap}. Methods that SOAP cannot
- * safely wire are skipped.
- * </p>
- *
- * <p>
- * The benefits of using the SOAP utility is that it is cross platform
- * compatible. SOAP allows different languages like Java, .NET, C++, PHP, and
- * even Perl, to call the generated services. One drawback of SOAP is that it is
- * slow because it needs to serialize all calls into a text format (XML).
- * </p>
- *
- * <p>
- * You can see a list of services at http://localhost:8080/api/axis. Set the
- * property <b>axis.servlet.hosts.allowed</b> in portal.properties to configure
- * security.
- * </p>
- *
- * <p>
- * The SOAP utility is only generated for remote services.
- * </p>
- *
- * @author Ryan Park
- * @see AppServiceHttp
- * @see com.liferay.marketplace.model.AppSoap
- * @see com.liferay.marketplace.service.AppServiceUtil
- * @generated
- */
-public class AppServiceSoap {
-	public static com.liferay.marketplace.model.AppSoap deleteApp(long appId)
-		throws RemoteException {
-		try {
-			com.liferay.marketplace.model.App returnValue = AppServiceUtil.deleteApp(appId);
-
-			return com.liferay.marketplace.model.AppSoap.toSoapModel(returnValue);
-		}
-		catch (Exception e) {
-			_log.error(e, e);
-
-			throw new RemoteException(e.getMessage());
-		}
-	}
-
-	public static void installApp(long remoteAppId) throws RemoteException {
-		try {
-			AppServiceUtil.installApp(remoteAppId);
-		}
-		catch (Exception e) {
-			_log.error(e, e);
-
-			throw new RemoteException(e.getMessage());
-		}
-	}
-
-	public static void uninstallApp(long remoteAppId) throws RemoteException {
-		try {
-			AppServiceUtil.uninstallApp(remoteAppId);
-		}
-		catch (Exception e) {
-			_log.error(e, e);
-
-			throw new RemoteException(e.getMessage());
-		}
-	}
-
-	private static Log _log = LogFactoryUtil.getLog(AppServiceSoap.class);
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/AppLocalServiceImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/AppLocalServiceImpl.java
deleted file mode 100644
index 521f543..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/AppLocalServiceImpl.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.impl;
-
-import com.liferay.marketplace.AppPropertiesException;
-import com.liferay.marketplace.AppTitleException;
-import com.liferay.marketplace.AppVersionException;
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.service.base.AppLocalServiceBaseImpl;
-import com.liferay.marketplace.util.comparator.AppTitleComparator;
-import com.liferay.portal.kernel.deploy.DeployManagerUtil;
-import com.liferay.portal.kernel.deploy.auto.context.AutoDeploymentContext;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.log.Log;
-import com.liferay.portal.kernel.log.LogFactoryUtil;
-import com.liferay.portal.kernel.plugin.PluginPackage;
-import com.liferay.portal.kernel.servlet.ServletContextPool;
-import com.liferay.portal.kernel.util.FileUtil;
-import com.liferay.portal.kernel.util.ListUtil;
-import com.liferay.portal.kernel.util.PropertiesUtil;
-import com.liferay.portal.kernel.util.ReleaseInfo;
-import com.liferay.portal.kernel.util.StreamUtil;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.StringUtil;
-import com.liferay.portal.kernel.util.SystemProperties;
-import com.liferay.portal.kernel.util.Time;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.model.CompanyConstants;
-import com.liferay.portal.model.User;
-import com.liferay.portal.util.PortalUtil;
-import com.liferay.portlet.documentlibrary.NoSuchFileException;
-import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-
-import javax.servlet.ServletContext;
-
-/**
- * @author Ryan Park
- */
-public class AppLocalServiceImpl extends AppLocalServiceBaseImpl {
-
-	@Override
-	public void clearInstalledAppsCache() {
-		_bundledApps = null;
-		_installedApps = null;
-	}
-
-	@Override
-	public App deleteApp(App app) throws SystemException {
-
-		// App
-
-		clearInstalledAppsCache();
-
-		appPersistence.remove(app);
-
-		// Module
-
-		List<Module> modules = modulePersistence.findByAppId(app.getAppId());
-
-		for (Module module : modules) {
-			moduleLocalService.deleteModule(module);
-		}
-
-		// File
-
-		try {
-			DLStoreUtil.deleteFile(
-				app.getCompanyId(), CompanyConstants.SYSTEM, app.getFilePath());
-		}
-		catch (Exception e) {
-			if (_log.isWarnEnabled()) {
-				_log.warn(e, e);
-			}
-		}
-
-		return app;
-	}
-
-	@Override
-	public App deleteApp(long appId) throws PortalException, SystemException {
-		App app = appPersistence.findByPrimaryKey(appId);
-
-		return deleteApp(app);
-	}
-
-	@Override
-	public App fetchRemoteApp(long remoteAppId) throws SystemException {
-		return appPersistence.fetchByRemoteAppId(remoteAppId);
-	}
-
-	@Override
-	public List<App> getApps(String category) throws SystemException {
-		return appPersistence.findByCategory(category);
-	}
-
-	@Override
-	public Map<String, String> getBundledApps() {
-		if (_bundledApps != null) {
-			return _bundledApps;
-		}
-
-		Map<String, String> bundledApps = new HashMap<String, String>();
-
-		List<PluginPackage> pluginPackages =
-			DeployManagerUtil.getInstalledPluginPackages();
-
-		for (PluginPackage pluginPackage : pluginPackages) {
-			ServletContext servletContext = ServletContextPool.get(
-				pluginPackage.getContext());
-
-			InputStream inputStream = null;
-
-			try {
-				inputStream = servletContext.getResourceAsStream(
-					"/WEB-INF/liferay-releng.changelog.md5");
-
-				if (inputStream == null) {
-					continue;
-				}
-
-				String relengHash = StringUtil.read(inputStream);
-
-				if (Validator.isNotNull(relengHash)) {
-					bundledApps.put(pluginPackage.getContext(), relengHash);
-				}
-			}
-			catch (Exception e) {
-				if (_log.isWarnEnabled()) {
-					_log.warn(
-						"Unable to read plugin package MD5 checksum for " +
-							pluginPackage.getContext());
-				}
-			}
-			finally {
-				StreamUtil.cleanUp(inputStream);
-			}
-		}
-
-		_bundledApps = bundledApps;
-
-		return _bundledApps;
-	}
-
-	@Override
-	public List<App> getInstalledApps() throws SystemException {
-		if (_installedApps != null) {
-			return _installedApps;
-		}
-
-		List<App> installedApps = new ArrayList<App>();
-
-		// Core app
-
-		App coreApp = appPersistence.create(0);
-
-		coreApp.setTitle("Liferay Core");
-		coreApp.setDescription("Plugins bundled with Liferay Portal.");
-		coreApp.setVersion(ReleaseInfo.getVersion());
-
-		coreApp.addContextName(PortalUtil.getPathContext());
-
-		installedApps.add(coreApp);
-
-		// Deployed apps
-
-		List<PluginPackage> pluginPackages =
-			DeployManagerUtil.getInstalledPluginPackages();
-
-		for (PluginPackage pluginPackage : pluginPackages) {
-			int count = modulePersistence.countByContextName(
-				pluginPackage.getContext());
-
-			if (count > 0) {
-				continue;
-			}
-
-			App app = appPersistence.create(0);
-
-			app.setTitle(pluginPackage.getName());
-			app.setDescription(pluginPackage.getLongDescription());
-			app.setVersion(pluginPackage.getVersion());
-
-			app.addContextName(pluginPackage.getContext());
-
-			installedApps.add(app);
-		}
-
-		// Marketplace apps
-
-		List<App> apps = appPersistence.findAll();
-
-		for (App app : apps) {
-			if (app.isInstalled()) {
-				installedApps.add(app);
-			}
-		}
-
-		installedApps = ListUtil.sort(installedApps, new AppTitleComparator());
-
-		_installedApps = installedApps;
-
-		return _installedApps;
-	}
-
-	@Override
-	public void installApp(long remoteAppId)
-		throws PortalException, SystemException {
-
-		App app = appPersistence.findByRemoteAppId(remoteAppId);
-
-		if (!DLStoreUtil.hasFile(
-				app.getCompanyId(), CompanyConstants.SYSTEM,
-				app.getFilePath())) {
-
-			throw new NoSuchFileException();
-		}
-
-		String tmpDir =
-			SystemProperties.get(SystemProperties.TMP_DIR) + StringPool.SLASH +
-				Time.getTimestamp();
-
-		InputStream inputStream = null;
-
-		ZipFile zipFile = null;
-
-		try {
-			inputStream = DLStoreUtil.getFileAsStream(
-				app.getCompanyId(), CompanyConstants.SYSTEM, app.getFilePath());
-
-			if (inputStream == null) {
-				throw new IOException(
-					"Unable to open file at " + app.getFilePath());
-			}
-
-			File liferayPackageFile = FileUtil.createTempFile(inputStream);
-
-			zipFile = new ZipFile(liferayPackageFile);
-
-			Enumeration<ZipEntry> enu =
-				(Enumeration<ZipEntry>)zipFile.entries();
-
-			while (enu.hasMoreElements()) {
-				ZipEntry zipEntry = enu.nextElement();
-
-				AutoDeploymentContext autoDeploymentContext =
-					new AutoDeploymentContext();
-
-				String fileName = zipEntry.getName();
-
-				if (!fileName.endsWith(".war") &&
-					!fileName.endsWith(".xml") &&
-					!fileName.endsWith(".zip") &&
-					!fileName.equals("liferay-marketplace.properties")) {
-
-					continue;
-				}
-
-				String contextName = getContextName(fileName);
-
-				autoDeploymentContext.setContext(contextName);
-
-				if (_log.isInfoEnabled()) {
-					_log.info(
-						"Extracting " + fileName + " from app " +
-							app.getAppId());
-				}
-
-				InputStream zipInputStream = null;
-
-				try {
-					zipInputStream = zipFile.getInputStream(zipEntry);
-
-					if (fileName.equals("liferay-marketplace.properties")) {
-						String propertiesString = StringUtil.read(
-							zipInputStream);
-
-						Properties properties = PropertiesUtil.load(
-							propertiesString);
-
-						processMarketplaceProperties(properties);
-					}
-					else {
-						File pluginPackageFile = new File(
-							tmpDir + StringPool.SLASH + fileName);
-
-						FileUtil.write(pluginPackageFile, zipInputStream);
-
-						autoDeploymentContext.setFile(pluginPackageFile);
-
-						DeployManagerUtil.deploy(autoDeploymentContext);
-
-						moduleLocalService.addModule(
-							app.getUserId(), app.getAppId(), contextName);
-					}
-				}
-				finally {
-					StreamUtil.cleanUp(zipInputStream);
-				}
-			}
-		}
-		catch (ZipException ze) {
-			if (_log.isInfoEnabled()) {
-				_log.info(
-					"Deleting corrupt package from app " + app.getAppId(), ze);
-			}
-
-			deleteApp(app);
-		}
-		catch (IOException ioe) {
-			throw new PortalException(ioe.getMessage());
-		}
-		catch (Exception e) {
-			_log.error(e, e);
-		}
-		finally {
-			FileUtil.deltree(tmpDir);
-
-			if (zipFile != null) {
-				try {
-					zipFile.close();
-				}
-				catch (IOException ioe) {
-				}
-			}
-
-			StreamUtil.cleanUp(inputStream);
-
-			clearInstalledAppsCache();
-		}
-	}
-
-	@Override
-	public void processMarketplaceProperties(Properties properties)
-		throws PortalException, SystemException {
-
-		long[] supersedesRemoteAppIds = StringUtil.split(
-			properties.getProperty("supersedes-remote-app-ids"), 0L);
-
-		for (long supersedesRemoteAppId : supersedesRemoteAppIds) {
-			App supersedesApp = appPersistence.fetchByRemoteAppId(
-				supersedesRemoteAppId);
-
-			if ((supersedesApp != null) && supersedesApp.isInstalled()) {
-				uninstallApp(supersedesRemoteAppId);
-			}
-		}
-	}
-
-	@Override
-	public void uninstallApp(long remoteAppId)
-		throws PortalException, SystemException {
-
-		clearInstalledAppsCache();
-
-		App app = appPersistence.findByRemoteAppId(remoteAppId);
-
-		List<Module> modules = modulePersistence.findByAppId(app.getAppId());
-
-		for (Module module : modules) {
-			moduleLocalService.deleteModule(module.getModuleId());
-
-			if (hasDependentApp(module)) {
-				continue;
-			}
-
-			try {
-				DeployManagerUtil.undeploy(module.getContextName());
-			}
-			catch (Exception e) {
-				_log.error(e, e);
-			}
-		}
-	}
-
-	@Override
-	public App updateApp(
-			long userId, long remoteAppId, String version, File file)
-		throws PortalException, SystemException {
-
-		Properties properties = getMarketplaceProperties(file);
-
-		if (properties == null) {
-			throw new AppPropertiesException(
-				"Unable to read liferay-marketplace.properties");
-		}
-
-		String title = properties.getProperty("title");
-		String description = properties.getProperty("description");
-		String category = properties.getProperty("category");
-		String iconURL = properties.getProperty("icon-url");
-
-		return updateApp(
-			userId, remoteAppId, title, description, category, iconURL, version,
-			file);
-	}
-
-	@Override
-	public App updateApp(
-			long userId, long remoteAppId, String title, String description,
-			String category, String iconURL, String version, File file)
-		throws PortalException, SystemException {
-
-		// App
-
-		User user = userPersistence.fetchByPrimaryKey(userId);
-		Date now = new Date();
-
-		validate(title, version);
-
-		App app = appPersistence.fetchByRemoteAppId(remoteAppId);
-
-		if (app == null) {
-			long appId = counterLocalService.increment();
-
-			app = appPersistence.create(appId);
-		}
-
-		if (user != null) {
-			app.setCompanyId(user.getCompanyId());
-			app.setUserId(user.getUserId());
-			app.setUserName(user.getFullName());
-		}
-
-		app.setCreateDate(now);
-		app.setModifiedDate(now);
-		app.setRemoteAppId(remoteAppId);
-		app.setTitle(title);
-		app.setDescription(description);
-		app.setCategory(category);
-		app.setIconURL(iconURL);
-		app.setVersion(version);
-
-		appPersistence.update(app);
-
-		// File
-
-		if (file != null) {
-			try {
-				DLStoreUtil.deleteFile(
-					app.getCompanyId(), CompanyConstants.SYSTEM,
-					app.getFilePath());
-			}
-			catch (Exception e) {
-			}
-
-			DLStoreUtil.addFile(
-				app.getCompanyId(), CompanyConstants.SYSTEM, app.getFilePath(),
-				false, file);
-		}
-
-		clearInstalledAppsCache();
-
-		return app;
-	}
-
-	protected String getContextName(String fileName) {
-		String context = fileName;
-
-		while (context.contains(StringPool.DASH)) {
-			if (context.endsWith("-ext") || context.endsWith("-hook") ||
-				context.endsWith("-layouttpl") ||
-				context.endsWith("-portlet") || context.endsWith("-theme") ||
-				context.endsWith("-web")) {
-
-				return context;
-			}
-
-			int pos = context.lastIndexOf(StringPool.DASH);
-
-			if (pos > 0) {
-				context = context.substring(0, pos);
-			}
-			else {
-				break;
-			}
-		}
-
-		return fileName;
-	}
-
-	protected Properties getMarketplaceProperties(File liferayPackageFile) {
-		InputStream inputStream = null;
-		ZipFile zipFile = null;
-
-		try {
-			zipFile = new ZipFile(liferayPackageFile);
-
-			ZipEntry zipEntry = zipFile.getEntry(
-				"liferay-marketplace.properties");
-
-			inputStream = zipFile.getInputStream(zipEntry);
-
-			String propertiesString = StringUtil.read(inputStream);
-
-			return PropertiesUtil.load(propertiesString);
-		}
-		catch (IOException ioe) {
-			return null;
-		}
-		finally {
-			if (zipFile != null) {
-				try {
-					zipFile.close();
-				}
-				catch (IOException ioe) {
-				}
-			}
-
-			StreamUtil.cleanUp(inputStream);
-		}
-	}
-
-	protected boolean hasDependentApp(Module module)
-		throws PortalException, SystemException {
-
-		List<Module> modules = modulePersistence.findByContextName(
-			module.getContextName());
-
-		for (Module curModule : modules) {
-			App app = appPersistence.findByPrimaryKey(curModule.getAppId());
-
-			if (curModule.getAppId() == module.getAppId()) {
-				continue;
-			}
-
-			if (app.isInstalled()) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	protected void validate(String title, String version)
-		throws PortalException, SystemException {
-
-		if (Validator.isNull(title)) {
-			throw new AppTitleException();
-		}
-
-		if (Validator.isNull(version)) {
-			throw new AppVersionException();
-		}
-	}
-
-	private static Log _log = LogFactoryUtil.getLog(AppLocalServiceImpl.class);
-
-	private Map<String, String> _bundledApps;
-	private List<App> _installedApps;
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/AppServiceImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/AppServiceImpl.java
deleted file mode 100644
index baefacd..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/AppServiceImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.impl;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.base.AppServiceBaseImpl;
-import com.liferay.marketplace.service.permission.MarketplacePermission;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-
-import java.io.File;
-
-/**
- * @author Ryan Park
- */
-public class AppServiceImpl extends AppServiceBaseImpl {
-
-	@Override
-	public App deleteApp(long appId) throws PortalException, SystemException {
-		MarketplacePermission.check(getPermissionChecker());
-
-		return appLocalService.deleteApp(appId);
-	}
-
-	@Override
-	public void installApp(long remoteAppId)
-		throws PortalException, SystemException {
-
-		MarketplacePermission.check(getPermissionChecker());
-
-		appLocalService.installApp(remoteAppId);
-	}
-
-	@Override
-	public void uninstallApp(long remoteAppId)
-		throws PortalException, SystemException {
-
-		MarketplacePermission.check(getPermissionChecker());
-
-		appLocalService.uninstallApp(remoteAppId);
-	}
-
-	@Override
-	public App updateApp(long remoteAppId, String version, File file)
-		throws PortalException, SystemException {
-
-		MarketplacePermission.check(getPermissionChecker());
-
-		return appLocalService.updateApp(
-			getUserId(), remoteAppId, version, file);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/ModuleLocalServiceImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/ModuleLocalServiceImpl.java
deleted file mode 100644
index 2598c27..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/impl/ModuleLocalServiceImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.impl;
-
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.service.base.ModuleLocalServiceBaseImpl;
-import com.liferay.portal.kernel.exception.SystemException;
-
-import java.util.List;
-
-/**
- * @author Ryan Park
- */
-public class ModuleLocalServiceImpl extends ModuleLocalServiceBaseImpl {
-
-	@Override
-	public Module addModule(long userId, long appId, String contextName)
-		throws SystemException {
-
-		Module module = modulePersistence.fetchByA_C(appId, contextName);
-
-		if (module != null) {
-			return module;
-		}
-
-		long moduleId = counterLocalService.increment();
-
-		module = modulePersistence.create(moduleId);
-
-		module.setModuleId(moduleId);
-		module.setAppId(appId);
-		module.setContextName(contextName);
-
-		modulePersistence.update(module);
-
-		return module;
-	}
-
-	@Override
-	public Module fetchModule(long appId, String contextName)
-		throws SystemException {
-
-		return modulePersistence.fetchByA_C(appId, contextName);
-	}
-
-	@Override
-	public List<Module> getModules(long appId) throws SystemException {
-		return modulePersistence.findByAppId(appId);
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/permission/MarketplacePermission.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/permission/MarketplacePermission.java
deleted file mode 100644
index e2ee009..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/permission/MarketplacePermission.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.permission;
-
-import com.liferay.marketplace.util.MarketplaceUtil;
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.model.User;
-import com.liferay.portal.security.auth.PrincipalException;
-import com.liferay.portal.security.permission.PermissionChecker;
-import com.liferay.portal.service.UserLocalServiceUtil;
-
-/**
- * @author Ryan Park
- */
-public class MarketplacePermission {
-
-	public static void check(PermissionChecker permissionChecker)
-		throws PortalException, SystemException {
-
-		if (!contains(permissionChecker)) {
-			throw new PrincipalException();
-		}
-	}
-
-	public static boolean contains(PermissionChecker permissionChecker)
-		throws PortalException, SystemException {
-
-		if (!permissionChecker.isOmniadmin()) {
-			return false;
-		}
-
-		User user = UserLocalServiceUtil.getUserById(
-			permissionChecker.getUserId());
-
-		if (MarketplaceUtil.isMarketplaceAdmin(user)) {
-			return true;
-		}
-
-		return false;
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/persistence/AppPersistenceImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/persistence/AppPersistenceImpl.java
deleted file mode 100644
index e23adf9..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/persistence/AppPersistenceImpl.java
+++ /dev/null
@@ -1,3132 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.NoSuchAppException;
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.model.impl.AppImpl;
-import com.liferay.marketplace.model.impl.AppModelImpl;
-
-import com.liferay.portal.kernel.cache.CacheRegistryUtil;
-import com.liferay.portal.kernel.dao.orm.EntityCacheUtil;
-import com.liferay.portal.kernel.dao.orm.FinderCacheUtil;
-import com.liferay.portal.kernel.dao.orm.FinderPath;
-import com.liferay.portal.kernel.dao.orm.Query;
-import com.liferay.portal.kernel.dao.orm.QueryPos;
-import com.liferay.portal.kernel.dao.orm.QueryUtil;
-import com.liferay.portal.kernel.dao.orm.Session;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.log.Log;
-import com.liferay.portal.kernel.log.LogFactoryUtil;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.InstanceFactory;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.kernel.util.PropsKeys;
-import com.liferay.portal.kernel.util.PropsUtil;
-import com.liferay.portal.kernel.util.SetUtil;
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.StringUtil;
-import com.liferay.portal.kernel.util.UnmodifiableList;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
-import com.liferay.portal.model.CacheModel;
-import com.liferay.portal.model.ModelListener;
-import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The persistence implementation for the app service.
- *
- * <p>
- * Caching information and settings can be found in <code>portal.properties</code>
- * </p>
- *
- * @author Ryan Park
- * @see AppPersistence
- * @see AppUtil
- * @generated
- */
-public class AppPersistenceImpl extends BasePersistenceImpl<App>
-	implements AppPersistence {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. Always use {@link AppUtil} to access the app persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
-	 */
-	public static final String FINDER_CLASS_NAME_ENTITY = AppImpl.class.getName();
-	public static final String FINDER_CLASS_NAME_LIST_WITH_PAGINATION = FINDER_CLASS_NAME_ENTITY +
-		".List1";
-	public static final String FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION = FINDER_CLASS_NAME_ENTITY +
-		".List2";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_ALL = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findAll", new String[0]);
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findAll", new String[0]);
-	public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countAll", new String[0]);
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByUuid",
-			new String[] {
-				String.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid",
-			new String[] { String.class.getName() },
-			AppModelImpl.UUID_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_UUID = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid",
-			new String[] { String.class.getName() });
-
-	/**
-	 * Returns all the apps where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @return the matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByUuid(String uuid) throws SystemException {
-		return findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the apps where uuid = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param uuid the uuid
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @return the range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByUuid(String uuid, int start, int end)
-		throws SystemException {
-		return findByUuid(uuid, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the apps where uuid = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param uuid the uuid
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByUuid(String uuid, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID;
-			finderArgs = new Object[] { uuid };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID;
-			finderArgs = new Object[] { uuid, start, end, orderByComparator };
-		}
-
-		List<App> list = (List<App>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (App app : list) {
-				if (!Validator.equals(uuid, app.getUuid())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(3 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(3);
-			}
-
-			query.append(_SQL_SELECT_APP_WHERE);
-
-			boolean bindUuid = false;
-
-			if (uuid == null) {
-				query.append(_FINDER_COLUMN_UUID_UUID_1);
-			}
-			else if (uuid.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_UUID_UUID_3);
-			}
-			else {
-				bindUuid = true;
-
-				query.append(_FINDER_COLUMN_UUID_UUID_2);
-			}
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(AppModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindUuid) {
-					qPos.add(uuid);
-				}
-
-				if (!pagination) {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<App>(list);
-				}
-				else {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start, end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first app in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByUuid_First(String uuid, OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByUuid_First(uuid, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("uuid=");
-		msg.append(uuid);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the first app in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByUuid_First(String uuid,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<App> list = findByUuid(uuid, 0, 1, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last app in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByUuid_Last(String uuid, OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByUuid_Last(uuid, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("uuid=");
-		msg.append(uuid);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the last app in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByUuid_Last(String uuid, OrderByComparator orderByComparator)
-		throws SystemException {
-		int count = countByUuid(uuid);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<App> list = findByUuid(uuid, count - 1, count, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the apps before and after the current app in the ordered set where uuid = &#63;.
-	 *
-	 * @param appId the primary key of the current app
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App[] findByUuid_PrevAndNext(long appId, String uuid,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = findByPrimaryKey(appId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			App[] array = new AppImpl[3];
-
-			array[0] = getByUuid_PrevAndNext(session, app, uuid,
-					orderByComparator, true);
-
-			array[1] = app;
-
-			array[2] = getByUuid_PrevAndNext(session, app, uuid,
-					orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected App getByUuid_PrevAndNext(Session session, App app, String uuid,
-		OrderByComparator orderByComparator, boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_APP_WHERE);
-
-		boolean bindUuid = false;
-
-		if (uuid == null) {
-			query.append(_FINDER_COLUMN_UUID_UUID_1);
-		}
-		else if (uuid.equals(StringPool.BLANK)) {
-			query.append(_FINDER_COLUMN_UUID_UUID_3);
-		}
-		else {
-			bindUuid = true;
-
-			query.append(_FINDER_COLUMN_UUID_UUID_2);
-		}
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(AppModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		if (bindUuid) {
-			qPos.add(uuid);
-		}
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(app);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<App> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the apps where uuid = &#63; from the database.
-	 *
-	 * @param uuid the uuid
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByUuid(String uuid) throws SystemException {
-		for (App app : findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
-				null)) {
-			remove(app);
-		}
-	}
-
-	/**
-	 * Returns the number of apps where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @return the number of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByUuid(String uuid) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID;
-
-		Object[] finderArgs = new Object[] { uuid };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_APP_WHERE);
-
-			boolean bindUuid = false;
-
-			if (uuid == null) {
-				query.append(_FINDER_COLUMN_UUID_UUID_1);
-			}
-			else if (uuid.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_UUID_UUID_3);
-			}
-			else {
-				bindUuid = true;
-
-				query.append(_FINDER_COLUMN_UUID_UUID_2);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindUuid) {
-					qPos.add(uuid);
-				}
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_UUID_UUID_1 = "app.uuid IS NULL";
-	private static final String _FINDER_COLUMN_UUID_UUID_2 = "app.uuid = ?";
-	private static final String _FINDER_COLUMN_UUID_UUID_3 = "(app.uuid IS NULL OR app.uuid = '')";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID_C = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByUuid_C",
-			new String[] {
-				String.class.getName(), Long.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C =
-		new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid_C",
-			new String[] { String.class.getName(), Long.class.getName() },
-			AppModelImpl.UUID_COLUMN_BITMASK |
-			AppModelImpl.COMPANYID_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_UUID_C = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid_C",
-			new String[] { String.class.getName(), Long.class.getName() });
-
-	/**
-	 * Returns all the apps where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @return the matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByUuid_C(String uuid, long companyId)
-		throws SystemException {
-		return findByUuid_C(uuid, companyId, QueryUtil.ALL_POS,
-			QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the apps where uuid = &#63; and companyId = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @return the range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByUuid_C(String uuid, long companyId, int start,
-		int end) throws SystemException {
-		return findByUuid_C(uuid, companyId, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the apps where uuid = &#63; and companyId = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByUuid_C(String uuid, long companyId, int start,
-		int end, OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C;
-			finderArgs = new Object[] { uuid, companyId };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID_C;
-			finderArgs = new Object[] {
-					uuid, companyId,
-					
-					start, end, orderByComparator
-				};
-		}
-
-		List<App> list = (List<App>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (App app : list) {
-				if (!Validator.equals(uuid, app.getUuid()) ||
-						(companyId != app.getCompanyId())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(4 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(4);
-			}
-
-			query.append(_SQL_SELECT_APP_WHERE);
-
-			boolean bindUuid = false;
-
-			if (uuid == null) {
-				query.append(_FINDER_COLUMN_UUID_C_UUID_1);
-			}
-			else if (uuid.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_UUID_C_UUID_3);
-			}
-			else {
-				bindUuid = true;
-
-				query.append(_FINDER_COLUMN_UUID_C_UUID_2);
-			}
-
-			query.append(_FINDER_COLUMN_UUID_C_COMPANYID_2);
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(AppModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindUuid) {
-					qPos.add(uuid);
-				}
-
-				qPos.add(companyId);
-
-				if (!pagination) {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<App>(list);
-				}
-				else {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start, end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first app in the ordered set where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByUuid_C_First(String uuid, long companyId,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByUuid_C_First(uuid, companyId, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(6);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("uuid=");
-		msg.append(uuid);
-
-		msg.append(", companyId=");
-		msg.append(companyId);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the first app in the ordered set where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByUuid_C_First(String uuid, long companyId,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<App> list = findByUuid_C(uuid, companyId, 0, 1, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last app in the ordered set where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByUuid_C_Last(String uuid, long companyId,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByUuid_C_Last(uuid, companyId, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(6);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("uuid=");
-		msg.append(uuid);
-
-		msg.append(", companyId=");
-		msg.append(companyId);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the last app in the ordered set where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByUuid_C_Last(String uuid, long companyId,
-		OrderByComparator orderByComparator) throws SystemException {
-		int count = countByUuid_C(uuid, companyId);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<App> list = findByUuid_C(uuid, companyId, count - 1, count,
-				orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the apps before and after the current app in the ordered set where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param appId the primary key of the current app
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App[] findByUuid_C_PrevAndNext(long appId, String uuid,
-		long companyId, OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = findByPrimaryKey(appId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			App[] array = new AppImpl[3];
-
-			array[0] = getByUuid_C_PrevAndNext(session, app, uuid, companyId,
-					orderByComparator, true);
-
-			array[1] = app;
-
-			array[2] = getByUuid_C_PrevAndNext(session, app, uuid, companyId,
-					orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected App getByUuid_C_PrevAndNext(Session session, App app,
-		String uuid, long companyId, OrderByComparator orderByComparator,
-		boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_APP_WHERE);
-
-		boolean bindUuid = false;
-
-		if (uuid == null) {
-			query.append(_FINDER_COLUMN_UUID_C_UUID_1);
-		}
-		else if (uuid.equals(StringPool.BLANK)) {
-			query.append(_FINDER_COLUMN_UUID_C_UUID_3);
-		}
-		else {
-			bindUuid = true;
-
-			query.append(_FINDER_COLUMN_UUID_C_UUID_2);
-		}
-
-		query.append(_FINDER_COLUMN_UUID_C_COMPANYID_2);
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(AppModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		if (bindUuid) {
-			qPos.add(uuid);
-		}
-
-		qPos.add(companyId);
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(app);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<App> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the apps where uuid = &#63; and companyId = &#63; from the database.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByUuid_C(String uuid, long companyId)
-		throws SystemException {
-		for (App app : findByUuid_C(uuid, companyId, QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS, null)) {
-			remove(app);
-		}
-	}
-
-	/**
-	 * Returns the number of apps where uuid = &#63; and companyId = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param companyId the company ID
-	 * @return the number of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByUuid_C(String uuid, long companyId)
-		throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID_C;
-
-		Object[] finderArgs = new Object[] { uuid, companyId };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(3);
-
-			query.append(_SQL_COUNT_APP_WHERE);
-
-			boolean bindUuid = false;
-
-			if (uuid == null) {
-				query.append(_FINDER_COLUMN_UUID_C_UUID_1);
-			}
-			else if (uuid.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_UUID_C_UUID_3);
-			}
-			else {
-				bindUuid = true;
-
-				query.append(_FINDER_COLUMN_UUID_C_UUID_2);
-			}
-
-			query.append(_FINDER_COLUMN_UUID_C_COMPANYID_2);
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindUuid) {
-					qPos.add(uuid);
-				}
-
-				qPos.add(companyId);
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_UUID_C_UUID_1 = "app.uuid IS NULL AND ";
-	private static final String _FINDER_COLUMN_UUID_C_UUID_2 = "app.uuid = ? AND ";
-	private static final String _FINDER_COLUMN_UUID_C_UUID_3 = "(app.uuid IS NULL OR app.uuid = '') AND ";
-	private static final String _FINDER_COLUMN_UUID_C_COMPANYID_2 = "app.companyId = ?";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_COMPANYID =
-		new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByCompanyId",
-			new String[] {
-				Long.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_COMPANYID =
-		new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByCompanyId",
-			new String[] { Long.class.getName() },
-			AppModelImpl.COMPANYID_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_COMPANYID = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByCompanyId",
-			new String[] { Long.class.getName() });
-
-	/**
-	 * Returns all the apps where companyId = &#63;.
-	 *
-	 * @param companyId the company ID
-	 * @return the matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByCompanyId(long companyId) throws SystemException {
-		return findByCompanyId(companyId, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
-			null);
-	}
-
-	/**
-	 * Returns a range of all the apps where companyId = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param companyId the company ID
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @return the range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByCompanyId(long companyId, int start, int end)
-		throws SystemException {
-		return findByCompanyId(companyId, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the apps where companyId = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param companyId the company ID
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByCompanyId(long companyId, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_COMPANYID;
-			finderArgs = new Object[] { companyId };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_COMPANYID;
-			finderArgs = new Object[] { companyId, start, end, orderByComparator };
-		}
-
-		List<App> list = (List<App>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (App app : list) {
-				if ((companyId != app.getCompanyId())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(3 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(3);
-			}
-
-			query.append(_SQL_SELECT_APP_WHERE);
-
-			query.append(_FINDER_COLUMN_COMPANYID_COMPANYID_2);
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(AppModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(companyId);
-
-				if (!pagination) {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<App>(list);
-				}
-				else {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start, end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first app in the ordered set where companyId = &#63;.
-	 *
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByCompanyId_First(long companyId,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByCompanyId_First(companyId, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("companyId=");
-		msg.append(companyId);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the first app in the ordered set where companyId = &#63;.
-	 *
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByCompanyId_First(long companyId,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<App> list = findByCompanyId(companyId, 0, 1, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last app in the ordered set where companyId = &#63;.
-	 *
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByCompanyId_Last(long companyId,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByCompanyId_Last(companyId, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("companyId=");
-		msg.append(companyId);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the last app in the ordered set where companyId = &#63;.
-	 *
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByCompanyId_Last(long companyId,
-		OrderByComparator orderByComparator) throws SystemException {
-		int count = countByCompanyId(companyId);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<App> list = findByCompanyId(companyId, count - 1, count,
-				orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the apps before and after the current app in the ordered set where companyId = &#63;.
-	 *
-	 * @param appId the primary key of the current app
-	 * @param companyId the company ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App[] findByCompanyId_PrevAndNext(long appId, long companyId,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = findByPrimaryKey(appId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			App[] array = new AppImpl[3];
-
-			array[0] = getByCompanyId_PrevAndNext(session, app, companyId,
-					orderByComparator, true);
-
-			array[1] = app;
-
-			array[2] = getByCompanyId_PrevAndNext(session, app, companyId,
-					orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected App getByCompanyId_PrevAndNext(Session session, App app,
-		long companyId, OrderByComparator orderByComparator, boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_APP_WHERE);
-
-		query.append(_FINDER_COLUMN_COMPANYID_COMPANYID_2);
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(AppModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		qPos.add(companyId);
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(app);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<App> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the apps where companyId = &#63; from the database.
-	 *
-	 * @param companyId the company ID
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByCompanyId(long companyId) throws SystemException {
-		for (App app : findByCompanyId(companyId, QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS, null)) {
-			remove(app);
-		}
-	}
-
-	/**
-	 * Returns the number of apps where companyId = &#63;.
-	 *
-	 * @param companyId the company ID
-	 * @return the number of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByCompanyId(long companyId) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_COMPANYID;
-
-		Object[] finderArgs = new Object[] { companyId };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_APP_WHERE);
-
-			query.append(_FINDER_COLUMN_COMPANYID_COMPANYID_2);
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(companyId);
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_COMPANYID_COMPANYID_2 = "app.companyId = ?";
-	public static final FinderPath FINDER_PATH_FETCH_BY_REMOTEAPPID = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_ENTITY, "fetchByRemoteAppId",
-			new String[] { Long.class.getName() },
-			AppModelImpl.REMOTEAPPID_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_REMOTEAPPID = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByRemoteAppId",
-			new String[] { Long.class.getName() });
-
-	/**
-	 * Returns the app where remoteAppId = &#63; or throws a {@link com.liferay.marketplace.NoSuchAppException} if it could not be found.
-	 *
-	 * @param remoteAppId the remote app ID
-	 * @return the matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByRemoteAppId(long remoteAppId)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByRemoteAppId(remoteAppId);
-
-		if (app == null) {
-			StringBundler msg = new StringBundler(4);
-
-			msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-			msg.append("remoteAppId=");
-			msg.append(remoteAppId);
-
-			msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-			if (_log.isWarnEnabled()) {
-				_log.warn(msg.toString());
-			}
-
-			throw new NoSuchAppException(msg.toString());
-		}
-
-		return app;
-	}
-
-	/**
-	 * Returns the app where remoteAppId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
-	 *
-	 * @param remoteAppId the remote app ID
-	 * @return the matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByRemoteAppId(long remoteAppId) throws SystemException {
-		return fetchByRemoteAppId(remoteAppId, true);
-	}
-
-	/**
-	 * Returns the app where remoteAppId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
-	 *
-	 * @param remoteAppId the remote app ID
-	 * @param retrieveFromCache whether to use the finder cache
-	 * @return the matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByRemoteAppId(long remoteAppId, boolean retrieveFromCache)
-		throws SystemException {
-		Object[] finderArgs = new Object[] { remoteAppId };
-
-		Object result = null;
-
-		if (retrieveFromCache) {
-			result = FinderCacheUtil.getResult(FINDER_PATH_FETCH_BY_REMOTEAPPID,
-					finderArgs, this);
-		}
-
-		if (result instanceof App) {
-			App app = (App)result;
-
-			if ((remoteAppId != app.getRemoteAppId())) {
-				result = null;
-			}
-		}
-
-		if (result == null) {
-			StringBundler query = new StringBundler(3);
-
-			query.append(_SQL_SELECT_APP_WHERE);
-
-			query.append(_FINDER_COLUMN_REMOTEAPPID_REMOTEAPPID_2);
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(remoteAppId);
-
-				List<App> list = q.list();
-
-				if (list.isEmpty()) {
-					FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_REMOTEAPPID,
-						finderArgs, list);
-				}
-				else {
-					if ((list.size() > 1) && _log.isWarnEnabled()) {
-						_log.warn(
-							"AppPersistenceImpl.fetchByRemoteAppId(long, boolean) with parameters (" +
-							StringUtil.merge(finderArgs) +
-							") yields a result set with more than 1 result. This violates the logical unique restriction. There is no order guarantee on which result is returned by this finder.");
-					}
-
-					App app = list.get(0);
-
-					result = app;
-
-					cacheResult(app);
-
-					if ((app.getRemoteAppId() != remoteAppId)) {
-						FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_REMOTEAPPID,
-							finderArgs, app);
-					}
-				}
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(FINDER_PATH_FETCH_BY_REMOTEAPPID,
-					finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		if (result instanceof List<?>) {
-			return null;
-		}
-		else {
-			return (App)result;
-		}
-	}
-
-	/**
-	 * Removes the app where remoteAppId = &#63; from the database.
-	 *
-	 * @param remoteAppId the remote app ID
-	 * @return the app that was removed
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App removeByRemoteAppId(long remoteAppId)
-		throws NoSuchAppException, SystemException {
-		App app = findByRemoteAppId(remoteAppId);
-
-		return remove(app);
-	}
-
-	/**
-	 * Returns the number of apps where remoteAppId = &#63;.
-	 *
-	 * @param remoteAppId the remote app ID
-	 * @return the number of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByRemoteAppId(long remoteAppId) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_REMOTEAPPID;
-
-		Object[] finderArgs = new Object[] { remoteAppId };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_APP_WHERE);
-
-			query.append(_FINDER_COLUMN_REMOTEAPPID_REMOTEAPPID_2);
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(remoteAppId);
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_REMOTEAPPID_REMOTEAPPID_2 = "app.remoteAppId = ?";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_CATEGORY = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByCategory",
-			new String[] {
-				String.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CATEGORY =
-		new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, AppImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByCategory",
-			new String[] { String.class.getName() },
-			AppModelImpl.CATEGORY_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_CATEGORY = new FinderPath(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByCategory",
-			new String[] { String.class.getName() });
-
-	/**
-	 * Returns all the apps where category = &#63;.
-	 *
-	 * @param category the category
-	 * @return the matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByCategory(String category) throws SystemException {
-		return findByCategory(category, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
-			null);
-	}
-
-	/**
-	 * Returns a range of all the apps where category = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param category the category
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @return the range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByCategory(String category, int start, int end)
-		throws SystemException {
-		return findByCategory(category, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the apps where category = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param category the category
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findByCategory(String category, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CATEGORY;
-			finderArgs = new Object[] { category };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_CATEGORY;
-			finderArgs = new Object[] { category, start, end, orderByComparator };
-		}
-
-		List<App> list = (List<App>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (App app : list) {
-				if (!Validator.equals(category, app.getCategory())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(3 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(3);
-			}
-
-			query.append(_SQL_SELECT_APP_WHERE);
-
-			boolean bindCategory = false;
-
-			if (category == null) {
-				query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_1);
-			}
-			else if (category.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_3);
-			}
-			else {
-				bindCategory = true;
-
-				query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_2);
-			}
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(AppModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindCategory) {
-					qPos.add(category);
-				}
-
-				if (!pagination) {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<App>(list);
-				}
-				else {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start, end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first app in the ordered set where category = &#63;.
-	 *
-	 * @param category the category
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByCategory_First(String category,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByCategory_First(category, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("category=");
-		msg.append(category);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the first app in the ordered set where category = &#63;.
-	 *
-	 * @param category the category
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByCategory_First(String category,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<App> list = findByCategory(category, 0, 1, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last app in the ordered set where category = &#63;.
-	 *
-	 * @param category the category
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByCategory_Last(String category,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByCategory_Last(category, orderByComparator);
-
-		if (app != null) {
-			return app;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("category=");
-		msg.append(category);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchAppException(msg.toString());
-	}
-
-	/**
-	 * Returns the last app in the ordered set where category = &#63;.
-	 *
-	 * @param category the category
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching app, or <code>null</code> if a matching app could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByCategory_Last(String category,
-		OrderByComparator orderByComparator) throws SystemException {
-		int count = countByCategory(category);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<App> list = findByCategory(category, count - 1, count,
-				orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the apps before and after the current app in the ordered set where category = &#63;.
-	 *
-	 * @param appId the primary key of the current app
-	 * @param category the category
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App[] findByCategory_PrevAndNext(long appId, String category,
-		OrderByComparator orderByComparator)
-		throws NoSuchAppException, SystemException {
-		App app = findByPrimaryKey(appId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			App[] array = new AppImpl[3];
-
-			array[0] = getByCategory_PrevAndNext(session, app, category,
-					orderByComparator, true);
-
-			array[1] = app;
-
-			array[2] = getByCategory_PrevAndNext(session, app, category,
-					orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected App getByCategory_PrevAndNext(Session session, App app,
-		String category, OrderByComparator orderByComparator, boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_APP_WHERE);
-
-		boolean bindCategory = false;
-
-		if (category == null) {
-			query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_1);
-		}
-		else if (category.equals(StringPool.BLANK)) {
-			query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_3);
-		}
-		else {
-			bindCategory = true;
-
-			query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_2);
-		}
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(AppModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		if (bindCategory) {
-			qPos.add(category);
-		}
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(app);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<App> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the apps where category = &#63; from the database.
-	 *
-	 * @param category the category
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByCategory(String category) throws SystemException {
-		for (App app : findByCategory(category, QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS, null)) {
-			remove(app);
-		}
-	}
-
-	/**
-	 * Returns the number of apps where category = &#63;.
-	 *
-	 * @param category the category
-	 * @return the number of matching apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByCategory(String category) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_CATEGORY;
-
-		Object[] finderArgs = new Object[] { category };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_APP_WHERE);
-
-			boolean bindCategory = false;
-
-			if (category == null) {
-				query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_1);
-			}
-			else if (category.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_3);
-			}
-			else {
-				bindCategory = true;
-
-				query.append(_FINDER_COLUMN_CATEGORY_CATEGORY_2);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindCategory) {
-					qPos.add(category);
-				}
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_CATEGORY_CATEGORY_1 = "app.category IS NULL";
-	private static final String _FINDER_COLUMN_CATEGORY_CATEGORY_2 = "app.category = ?";
-	private static final String _FINDER_COLUMN_CATEGORY_CATEGORY_3 = "(app.category IS NULL OR app.category = '')";
-
-	public AppPersistenceImpl() {
-		setModelClass(App.class);
-	}
-
-	/**
-	 * Caches the app in the entity cache if it is enabled.
-	 *
-	 * @param app the app
-	 */
-	@Override
-	public void cacheResult(App app) {
-		EntityCacheUtil.putResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppImpl.class, app.getPrimaryKey(), app);
-
-		FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_REMOTEAPPID,
-			new Object[] { app.getRemoteAppId() }, app);
-
-		app.resetOriginalValues();
-	}
-
-	/**
-	 * Caches the apps in the entity cache if it is enabled.
-	 *
-	 * @param apps the apps
-	 */
-	@Override
-	public void cacheResult(List<App> apps) {
-		for (App app : apps) {
-			if (EntityCacheUtil.getResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-						AppImpl.class, app.getPrimaryKey()) == null) {
-				cacheResult(app);
-			}
-			else {
-				app.resetOriginalValues();
-			}
-		}
-	}
-
-	/**
-	 * Clears the cache for all apps.
-	 *
-	 * <p>
-	 * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
-	 * </p>
-	 */
-	@Override
-	public void clearCache() {
-		if (_HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE) {
-			CacheRegistryUtil.clear(AppImpl.class.getName());
-		}
-
-		EntityCacheUtil.clearCache(AppImpl.class.getName());
-
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_ENTITY);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-	}
-
-	/**
-	 * Clears the cache for the app.
-	 *
-	 * <p>
-	 * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
-	 * </p>
-	 */
-	@Override
-	public void clearCache(App app) {
-		EntityCacheUtil.removeResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppImpl.class, app.getPrimaryKey());
-
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-
-		clearUniqueFindersCache(app);
-	}
-
-	@Override
-	public void clearCache(List<App> apps) {
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-
-		for (App app : apps) {
-			EntityCacheUtil.removeResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-				AppImpl.class, app.getPrimaryKey());
-
-			clearUniqueFindersCache(app);
-		}
-	}
-
-	protected void cacheUniqueFindersCache(App app) {
-		if (app.isNew()) {
-			Object[] args = new Object[] { app.getRemoteAppId() };
-
-			FinderCacheUtil.putResult(FINDER_PATH_COUNT_BY_REMOTEAPPID, args,
-				Long.valueOf(1));
-			FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_REMOTEAPPID, args,
-				app);
-		}
-		else {
-			AppModelImpl appModelImpl = (AppModelImpl)app;
-
-			if ((appModelImpl.getColumnBitmask() &
-					FINDER_PATH_FETCH_BY_REMOTEAPPID.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] { app.getRemoteAppId() };
-
-				FinderCacheUtil.putResult(FINDER_PATH_COUNT_BY_REMOTEAPPID,
-					args, Long.valueOf(1));
-				FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_REMOTEAPPID,
-					args, app);
-			}
-		}
-	}
-
-	protected void clearUniqueFindersCache(App app) {
-		AppModelImpl appModelImpl = (AppModelImpl)app;
-
-		Object[] args = new Object[] { app.getRemoteAppId() };
-
-		FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_REMOTEAPPID, args);
-		FinderCacheUtil.removeResult(FINDER_PATH_FETCH_BY_REMOTEAPPID, args);
-
-		if ((appModelImpl.getColumnBitmask() &
-				FINDER_PATH_FETCH_BY_REMOTEAPPID.getColumnBitmask()) != 0) {
-			args = new Object[] { appModelImpl.getOriginalRemoteAppId() };
-
-			FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_REMOTEAPPID, args);
-			FinderCacheUtil.removeResult(FINDER_PATH_FETCH_BY_REMOTEAPPID, args);
-		}
-	}
-
-	/**
-	 * Creates a new app with the primary key. Does not add the app to the database.
-	 *
-	 * @param appId the primary key for the new app
-	 * @return the new app
-	 */
-	@Override
-	public App create(long appId) {
-		App app = new AppImpl();
-
-		app.setNew(true);
-		app.setPrimaryKey(appId);
-
-		String uuid = PortalUUIDUtil.generate();
-
-		app.setUuid(uuid);
-
-		return app;
-	}
-
-	/**
-	 * Removes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param appId the primary key of the app
-	 * @return the app that was removed
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App remove(long appId) throws NoSuchAppException, SystemException {
-		return remove((Serializable)appId);
-	}
-
-	/**
-	 * Removes the app with the primary key from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param primaryKey the primary key of the app
-	 * @return the app that was removed
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App remove(Serializable primaryKey)
-		throws NoSuchAppException, SystemException {
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			App app = (App)session.get(AppImpl.class, primaryKey);
-
-			if (app == null) {
-				if (_log.isWarnEnabled()) {
-					_log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
-				}
-
-				throw new NoSuchAppException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
-					primaryKey);
-			}
-
-			return remove(app);
-		}
-		catch (NoSuchAppException nsee) {
-			throw nsee;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	@Override
-	protected App removeImpl(App app) throws SystemException {
-		app = toUnwrappedModel(app);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			if (!session.contains(app)) {
-				app = (App)session.get(AppImpl.class, app.getPrimaryKeyObj());
-			}
-
-			if (app != null) {
-				session.delete(app);
-			}
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-
-		if (app != null) {
-			clearCache(app);
-		}
-
-		return app;
-	}
-
-	@Override
-	public App updateImpl(com.liferay.marketplace.model.App app)
-		throws SystemException {
-		app = toUnwrappedModel(app);
-
-		boolean isNew = app.isNew();
-
-		AppModelImpl appModelImpl = (AppModelImpl)app;
-
-		if (Validator.isNull(app.getUuid())) {
-			String uuid = PortalUUIDUtil.generate();
-
-			app.setUuid(uuid);
-		}
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			if (app.isNew()) {
-				session.save(app);
-
-				app.setNew(false);
-			}
-			else {
-				session.merge(app);
-			}
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-
-		if (isNew || !AppModelImpl.COLUMN_BITMASK_ENABLED) {
-			FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-		}
-
-		else {
-			if ((appModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] { appModelImpl.getOriginalUuid() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
-					args);
-
-				args = new Object[] { appModelImpl.getUuid() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
-					args);
-			}
-
-			if ((appModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] {
-						appModelImpl.getOriginalUuid(),
-						appModelImpl.getOriginalCompanyId()
-					};
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID_C, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C,
-					args);
-
-				args = new Object[] {
-						appModelImpl.getUuid(), appModelImpl.getCompanyId()
-					};
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID_C, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C,
-					args);
-			}
-
-			if ((appModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_COMPANYID.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] { appModelImpl.getOriginalCompanyId() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_COMPANYID,
-					args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_COMPANYID,
-					args);
-
-				args = new Object[] { appModelImpl.getCompanyId() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_COMPANYID,
-					args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_COMPANYID,
-					args);
-			}
-
-			if ((appModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CATEGORY.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] { appModelImpl.getOriginalCategory() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_CATEGORY, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CATEGORY,
-					args);
-
-				args = new Object[] { appModelImpl.getCategory() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_CATEGORY, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CATEGORY,
-					args);
-			}
-		}
-
-		EntityCacheUtil.putResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-			AppImpl.class, app.getPrimaryKey(), app);
-
-		clearUniqueFindersCache(app);
-		cacheUniqueFindersCache(app);
-
-		return app;
-	}
-
-	protected App toUnwrappedModel(App app) {
-		if (app instanceof AppImpl) {
-			return app;
-		}
-
-		AppImpl appImpl = new AppImpl();
-
-		appImpl.setNew(app.isNew());
-		appImpl.setPrimaryKey(app.getPrimaryKey());
-
-		appImpl.setUuid(app.getUuid());
-		appImpl.setAppId(app.getAppId());
-		appImpl.setCompanyId(app.getCompanyId());
-		appImpl.setUserId(app.getUserId());
-		appImpl.setUserName(app.getUserName());
-		appImpl.setCreateDate(app.getCreateDate());
-		appImpl.setModifiedDate(app.getModifiedDate());
-		appImpl.setRemoteAppId(app.getRemoteAppId());
-		appImpl.setTitle(app.getTitle());
-		appImpl.setDescription(app.getDescription());
-		appImpl.setCategory(app.getCategory());
-		appImpl.setIconURL(app.getIconURL());
-		appImpl.setVersion(app.getVersion());
-
-		return appImpl;
-	}
-
-	/**
-	 * Returns the app with the primary key or throws a {@link com.liferay.portal.NoSuchModelException} if it could not be found.
-	 *
-	 * @param primaryKey the primary key of the app
-	 * @return the app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByPrimaryKey(Serializable primaryKey)
-		throws NoSuchAppException, SystemException {
-		App app = fetchByPrimaryKey(primaryKey);
-
-		if (app == null) {
-			if (_log.isWarnEnabled()) {
-				_log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
-			}
-
-			throw new NoSuchAppException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
-				primaryKey);
-		}
-
-		return app;
-	}
-
-	/**
-	 * Returns the app with the primary key or throws a {@link com.liferay.marketplace.NoSuchAppException} if it could not be found.
-	 *
-	 * @param appId the primary key of the app
-	 * @return the app
-	 * @throws com.liferay.marketplace.NoSuchAppException if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App findByPrimaryKey(long appId)
-		throws NoSuchAppException, SystemException {
-		return findByPrimaryKey((Serializable)appId);
-	}
-
-	/**
-	 * Returns the app with the primary key or returns <code>null</code> if it could not be found.
-	 *
-	 * @param primaryKey the primary key of the app
-	 * @return the app, or <code>null</code> if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByPrimaryKey(Serializable primaryKey)
-		throws SystemException {
-		App app = (App)EntityCacheUtil.getResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-				AppImpl.class, primaryKey);
-
-		if (app == _nullApp) {
-			return null;
-		}
-
-		if (app == null) {
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				app = (App)session.get(AppImpl.class, primaryKey);
-
-				if (app != null) {
-					cacheResult(app);
-				}
-				else {
-					EntityCacheUtil.putResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-						AppImpl.class, primaryKey, _nullApp);
-				}
-			}
-			catch (Exception e) {
-				EntityCacheUtil.removeResult(AppModelImpl.ENTITY_CACHE_ENABLED,
-					AppImpl.class, primaryKey);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return app;
-	}
-
-	/**
-	 * Returns the app with the primary key or returns <code>null</code> if it could not be found.
-	 *
-	 * @param appId the primary key of the app
-	 * @return the app, or <code>null</code> if a app with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public App fetchByPrimaryKey(long appId) throws SystemException {
-		return fetchByPrimaryKey((Serializable)appId);
-	}
-
-	/**
-	 * Returns all the apps.
-	 *
-	 * @return the apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findAll() throws SystemException {
-		return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the apps.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @return the range of apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findAll(int start, int end) throws SystemException {
-		return findAll(start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the apps.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.AppModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param start the lower bound of the range of apps
-	 * @param end the upper bound of the range of apps (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<App> findAll(int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL;
-			finderArgs = FINDER_ARGS_EMPTY;
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_ALL;
-			finderArgs = new Object[] { start, end, orderByComparator };
-		}
-
-		List<App> list = (List<App>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if (list == null) {
-			StringBundler query = null;
-			String sql = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(2 +
-						(orderByComparator.getOrderByFields().length * 3));
-
-				query.append(_SQL_SELECT_APP);
-
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-
-				sql = query.toString();
-			}
-			else {
-				sql = _SQL_SELECT_APP;
-
-				if (pagination) {
-					sql = sql.concat(AppModelImpl.ORDER_BY_JPQL);
-				}
-			}
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				if (!pagination) {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<App>(list);
-				}
-				else {
-					list = (List<App>)QueryUtil.list(q, getDialect(), start, end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Removes all the apps from the database.
-	 *
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeAll() throws SystemException {
-		for (App app : findAll()) {
-			remove(app);
-		}
-	}
-
-	/**
-	 * Returns the number of apps.
-	 *
-	 * @return the number of apps
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countAll() throws SystemException {
-		Long count = (Long)FinderCacheUtil.getResult(FINDER_PATH_COUNT_ALL,
-				FINDER_ARGS_EMPTY, this);
-
-		if (count == null) {
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(_SQL_COUNT_APP);
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(FINDER_PATH_COUNT_ALL,
-					FINDER_ARGS_EMPTY, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_ALL,
-					FINDER_ARGS_EMPTY);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	@Override
-	protected Set<String> getBadColumnNames() {
-		return _badColumnNames;
-	}
-
-	/**
-	 * Initializes the app persistence.
-	 */
-	public void afterPropertiesSet() {
-		String[] listenerClassNames = StringUtil.split(GetterUtil.getString(
-					com.liferay.util.service.ServiceProps.get(
-						"value.object.listener.com.liferay.marketplace.model.App")));
-
-		if (listenerClassNames.length > 0) {
-			try {
-				List<ModelListener<App>> listenersList = new ArrayList<ModelListener<App>>();
-
-				for (String listenerClassName : listenerClassNames) {
-					listenersList.add((ModelListener<App>)InstanceFactory.newInstance(
-							getClassLoader(), listenerClassName));
-				}
-
-				listeners = listenersList.toArray(new ModelListener[listenersList.size()]);
-			}
-			catch (Exception e) {
-				_log.error(e);
-			}
-		}
-	}
-
-	public void destroy() {
-		EntityCacheUtil.removeCache(AppImpl.class.getName());
-		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_ENTITY);
-		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-	}
-
-	private static final String _SQL_SELECT_APP = "SELECT app FROM App app";
-	private static final String _SQL_SELECT_APP_WHERE = "SELECT app FROM App app WHERE ";
-	private static final String _SQL_COUNT_APP = "SELECT COUNT(app) FROM App app";
-	private static final String _SQL_COUNT_APP_WHERE = "SELECT COUNT(app) FROM App app WHERE ";
-	private static final String _ORDER_BY_ENTITY_ALIAS = "app.";
-	private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No App exists with the primary key ";
-	private static final String _NO_SUCH_ENTITY_WITH_KEY = "No App exists with the key {";
-	private static final boolean _HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE = GetterUtil.getBoolean(PropsUtil.get(
-				PropsKeys.HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE));
-	private static Log _log = LogFactoryUtil.getLog(AppPersistenceImpl.class);
-	private static Set<String> _badColumnNames = SetUtil.fromArray(new String[] {
-				"uuid"
-			});
-	private static App _nullApp = new AppImpl() {
-			@Override
-			public Object clone() {
-				return this;
-			}
-
-			@Override
-			public CacheModel<App> toCacheModel() {
-				return _nullAppCacheModel;
-			}
-		};
-
-	private static CacheModel<App> _nullAppCacheModel = new CacheModel<App>() {
-			@Override
-			public App toEntityModel() {
-				return _nullApp;
-			}
-		};
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/persistence/ModulePersistenceImpl.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/persistence/ModulePersistenceImpl.java
deleted file mode 100644
index ed988be..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/service/persistence/ModulePersistenceImpl.java
+++ /dev/null
@@ -1,2606 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.service.persistence;
-
-import com.liferay.marketplace.NoSuchModuleException;
-import com.liferay.marketplace.model.Module;
-import com.liferay.marketplace.model.impl.ModuleImpl;
-import com.liferay.marketplace.model.impl.ModuleModelImpl;
-
-import com.liferay.portal.kernel.cache.CacheRegistryUtil;
-import com.liferay.portal.kernel.dao.orm.EntityCacheUtil;
-import com.liferay.portal.kernel.dao.orm.FinderCacheUtil;
-import com.liferay.portal.kernel.dao.orm.FinderPath;
-import com.liferay.portal.kernel.dao.orm.Query;
-import com.liferay.portal.kernel.dao.orm.QueryPos;
-import com.liferay.portal.kernel.dao.orm.QueryUtil;
-import com.liferay.portal.kernel.dao.orm.Session;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.log.Log;
-import com.liferay.portal.kernel.log.LogFactoryUtil;
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.InstanceFactory;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.kernel.util.PropsKeys;
-import com.liferay.portal.kernel.util.PropsUtil;
-import com.liferay.portal.kernel.util.SetUtil;
-import com.liferay.portal.kernel.util.StringBundler;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.StringUtil;
-import com.liferay.portal.kernel.util.UnmodifiableList;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
-import com.liferay.portal.model.CacheModel;
-import com.liferay.portal.model.ModelListener;
-import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
-
-import java.io.Serializable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The persistence implementation for the module service.
- *
- * <p>
- * Caching information and settings can be found in <code>portal.properties</code>
- * </p>
- *
- * @author Ryan Park
- * @see ModulePersistence
- * @see ModuleUtil
- * @generated
- */
-public class ModulePersistenceImpl extends BasePersistenceImpl<Module>
-	implements ModulePersistence {
-	/*
-	 * NOTE FOR DEVELOPERS:
-	 *
-	 * Never modify or reference this class directly. Always use {@link ModuleUtil} to access the module persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
-	 */
-	public static final String FINDER_CLASS_NAME_ENTITY = ModuleImpl.class.getName();
-	public static final String FINDER_CLASS_NAME_LIST_WITH_PAGINATION = FINDER_CLASS_NAME_ENTITY +
-		".List1";
-	public static final String FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION = FINDER_CLASS_NAME_ENTITY +
-		".List2";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_ALL = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findAll", new String[0]);
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findAll", new String[0]);
-	public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countAll", new String[0]);
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByUuid",
-			new String[] {
-				String.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid",
-			new String[] { String.class.getName() },
-			ModuleModelImpl.UUID_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_UUID = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid",
-			new String[] { String.class.getName() });
-
-	/**
-	 * Returns all the modules where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @return the matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByUuid(String uuid) throws SystemException {
-		return findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the modules where uuid = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param uuid the uuid
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @return the range of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByUuid(String uuid, int start, int end)
-		throws SystemException {
-		return findByUuid(uuid, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the modules where uuid = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param uuid the uuid
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByUuid(String uuid, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID;
-			finderArgs = new Object[] { uuid };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID;
-			finderArgs = new Object[] { uuid, start, end, orderByComparator };
-		}
-
-		List<Module> list = (List<Module>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (Module module : list) {
-				if (!Validator.equals(uuid, module.getUuid())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(3 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(3);
-			}
-
-			query.append(_SQL_SELECT_MODULE_WHERE);
-
-			boolean bindUuid = false;
-
-			if (uuid == null) {
-				query.append(_FINDER_COLUMN_UUID_UUID_1);
-			}
-			else if (uuid.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_UUID_UUID_3);
-			}
-			else {
-				bindUuid = true;
-
-				query.append(_FINDER_COLUMN_UUID_UUID_2);
-			}
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(ModuleModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindUuid) {
-					qPos.add(uuid);
-				}
-
-				if (!pagination) {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<Module>(list);
-				}
-				else {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first module in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByUuid_First(String uuid,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByUuid_First(uuid, orderByComparator);
-
-		if (module != null) {
-			return module;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("uuid=");
-		msg.append(uuid);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchModuleException(msg.toString());
-	}
-
-	/**
-	 * Returns the first module in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByUuid_First(String uuid,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<Module> list = findByUuid(uuid, 0, 1, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last module in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByUuid_Last(String uuid,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByUuid_Last(uuid, orderByComparator);
-
-		if (module != null) {
-			return module;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("uuid=");
-		msg.append(uuid);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchModuleException(msg.toString());
-	}
-
-	/**
-	 * Returns the last module in the ordered set where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByUuid_Last(String uuid,
-		OrderByComparator orderByComparator) throws SystemException {
-		int count = countByUuid(uuid);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<Module> list = findByUuid(uuid, count - 1, count, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the modules before and after the current module in the ordered set where uuid = &#63;.
-	 *
-	 * @param moduleId the primary key of the current module
-	 * @param uuid the uuid
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module[] findByUuid_PrevAndNext(long moduleId, String uuid,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = findByPrimaryKey(moduleId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			Module[] array = new ModuleImpl[3];
-
-			array[0] = getByUuid_PrevAndNext(session, module, uuid,
-					orderByComparator, true);
-
-			array[1] = module;
-
-			array[2] = getByUuid_PrevAndNext(session, module, uuid,
-					orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected Module getByUuid_PrevAndNext(Session session, Module module,
-		String uuid, OrderByComparator orderByComparator, boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_MODULE_WHERE);
-
-		boolean bindUuid = false;
-
-		if (uuid == null) {
-			query.append(_FINDER_COLUMN_UUID_UUID_1);
-		}
-		else if (uuid.equals(StringPool.BLANK)) {
-			query.append(_FINDER_COLUMN_UUID_UUID_3);
-		}
-		else {
-			bindUuid = true;
-
-			query.append(_FINDER_COLUMN_UUID_UUID_2);
-		}
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(ModuleModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		if (bindUuid) {
-			qPos.add(uuid);
-		}
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(module);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<Module> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the modules where uuid = &#63; from the database.
-	 *
-	 * @param uuid the uuid
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByUuid(String uuid) throws SystemException {
-		for (Module module : findByUuid(uuid, QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS, null)) {
-			remove(module);
-		}
-	}
-
-	/**
-	 * Returns the number of modules where uuid = &#63;.
-	 *
-	 * @param uuid the uuid
-	 * @return the number of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByUuid(String uuid) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID;
-
-		Object[] finderArgs = new Object[] { uuid };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_MODULE_WHERE);
-
-			boolean bindUuid = false;
-
-			if (uuid == null) {
-				query.append(_FINDER_COLUMN_UUID_UUID_1);
-			}
-			else if (uuid.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_UUID_UUID_3);
-			}
-			else {
-				bindUuid = true;
-
-				query.append(_FINDER_COLUMN_UUID_UUID_2);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindUuid) {
-					qPos.add(uuid);
-				}
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_UUID_UUID_1 = "module.uuid IS NULL";
-	private static final String _FINDER_COLUMN_UUID_UUID_2 = "module.uuid = ?";
-	private static final String _FINDER_COLUMN_UUID_UUID_3 = "(module.uuid IS NULL OR module.uuid = '')";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_APPID = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByAppId",
-			new String[] {
-				Long.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_APPID = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByAppId",
-			new String[] { Long.class.getName() },
-			ModuleModelImpl.APPID_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_APPID = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByAppId",
-			new String[] { Long.class.getName() });
-
-	/**
-	 * Returns all the modules where appId = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @return the matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByAppId(long appId) throws SystemException {
-		return findByAppId(appId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the modules where appId = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param appId the app ID
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @return the range of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByAppId(long appId, int start, int end)
-		throws SystemException {
-		return findByAppId(appId, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the modules where appId = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param appId the app ID
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByAppId(long appId, int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_APPID;
-			finderArgs = new Object[] { appId };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_APPID;
-			finderArgs = new Object[] { appId, start, end, orderByComparator };
-		}
-
-		List<Module> list = (List<Module>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (Module module : list) {
-				if ((appId != module.getAppId())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(3 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(3);
-			}
-
-			query.append(_SQL_SELECT_MODULE_WHERE);
-
-			query.append(_FINDER_COLUMN_APPID_APPID_2);
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(ModuleModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(appId);
-
-				if (!pagination) {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<Module>(list);
-				}
-				else {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first module in the ordered set where appId = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByAppId_First(long appId,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByAppId_First(appId, orderByComparator);
-
-		if (module != null) {
-			return module;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("appId=");
-		msg.append(appId);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchModuleException(msg.toString());
-	}
-
-	/**
-	 * Returns the first module in the ordered set where appId = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByAppId_First(long appId,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<Module> list = findByAppId(appId, 0, 1, orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last module in the ordered set where appId = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByAppId_Last(long appId,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByAppId_Last(appId, orderByComparator);
-
-		if (module != null) {
-			return module;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("appId=");
-		msg.append(appId);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchModuleException(msg.toString());
-	}
-
-	/**
-	 * Returns the last module in the ordered set where appId = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByAppId_Last(long appId,
-		OrderByComparator orderByComparator) throws SystemException {
-		int count = countByAppId(appId);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<Module> list = findByAppId(appId, count - 1, count,
-				orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the modules before and after the current module in the ordered set where appId = &#63;.
-	 *
-	 * @param moduleId the primary key of the current module
-	 * @param appId the app ID
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module[] findByAppId_PrevAndNext(long moduleId, long appId,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = findByPrimaryKey(moduleId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			Module[] array = new ModuleImpl[3];
-
-			array[0] = getByAppId_PrevAndNext(session, module, appId,
-					orderByComparator, true);
-
-			array[1] = module;
-
-			array[2] = getByAppId_PrevAndNext(session, module, appId,
-					orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected Module getByAppId_PrevAndNext(Session session, Module module,
-		long appId, OrderByComparator orderByComparator, boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_MODULE_WHERE);
-
-		query.append(_FINDER_COLUMN_APPID_APPID_2);
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(ModuleModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		qPos.add(appId);
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(module);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<Module> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the modules where appId = &#63; from the database.
-	 *
-	 * @param appId the app ID
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByAppId(long appId) throws SystemException {
-		for (Module module : findByAppId(appId, QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS, null)) {
-			remove(module);
-		}
-	}
-
-	/**
-	 * Returns the number of modules where appId = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @return the number of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByAppId(long appId) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_APPID;
-
-		Object[] finderArgs = new Object[] { appId };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_MODULE_WHERE);
-
-			query.append(_FINDER_COLUMN_APPID_APPID_2);
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(appId);
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_APPID_APPID_2 = "module.appId = ?";
-	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_CONTEXTNAME =
-		new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByContextName",
-			new String[] {
-				String.class.getName(),
-				
-			Integer.class.getName(), Integer.class.getName(),
-				OrderByComparator.class.getName()
-			});
-	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CONTEXTNAME =
-		new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByContextName",
-			new String[] { String.class.getName() },
-			ModuleModelImpl.CONTEXTNAME_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_CONTEXTNAME = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByContextName",
-			new String[] { String.class.getName() });
-
-	/**
-	 * Returns all the modules where contextName = &#63;.
-	 *
-	 * @param contextName the context name
-	 * @return the matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByContextName(String contextName)
-		throws SystemException {
-		return findByContextName(contextName, QueryUtil.ALL_POS,
-			QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the modules where contextName = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param contextName the context name
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @return the range of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByContextName(String contextName, int start, int end)
-		throws SystemException {
-		return findByContextName(contextName, start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the modules where contextName = &#63;.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param contextName the context name
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findByContextName(String contextName, int start,
-		int end, OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CONTEXTNAME;
-			finderArgs = new Object[] { contextName };
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_CONTEXTNAME;
-			finderArgs = new Object[] { contextName, start, end, orderByComparator };
-		}
-
-		List<Module> list = (List<Module>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if ((list != null) && !list.isEmpty()) {
-			for (Module module : list) {
-				if (!Validator.equals(contextName, module.getContextName())) {
-					list = null;
-
-					break;
-				}
-			}
-		}
-
-		if (list == null) {
-			StringBundler query = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(3 +
-						(orderByComparator.getOrderByFields().length * 3));
-			}
-			else {
-				query = new StringBundler(3);
-			}
-
-			query.append(_SQL_SELECT_MODULE_WHERE);
-
-			boolean bindContextName = false;
-
-			if (contextName == null) {
-				query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_1);
-			}
-			else if (contextName.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_3);
-			}
-			else {
-				bindContextName = true;
-
-				query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_2);
-			}
-
-			if (orderByComparator != null) {
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-			}
-			else
-			 if (pagination) {
-				query.append(ModuleModelImpl.ORDER_BY_JPQL);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindContextName) {
-					qPos.add(contextName);
-				}
-
-				if (!pagination) {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<Module>(list);
-				}
-				else {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Returns the first module in the ordered set where contextName = &#63;.
-	 *
-	 * @param contextName the context name
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByContextName_First(String contextName,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByContextName_First(contextName, orderByComparator);
-
-		if (module != null) {
-			return module;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("contextName=");
-		msg.append(contextName);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchModuleException(msg.toString());
-	}
-
-	/**
-	 * Returns the first module in the ordered set where contextName = &#63;.
-	 *
-	 * @param contextName the context name
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the first matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByContextName_First(String contextName,
-		OrderByComparator orderByComparator) throws SystemException {
-		List<Module> list = findByContextName(contextName, 0, 1,
-				orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the last module in the ordered set where contextName = &#63;.
-	 *
-	 * @param contextName the context name
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByContextName_Last(String contextName,
-		OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByContextName_Last(contextName, orderByComparator);
-
-		if (module != null) {
-			return module;
-		}
-
-		StringBundler msg = new StringBundler(4);
-
-		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-		msg.append("contextName=");
-		msg.append(contextName);
-
-		msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-		throw new NoSuchModuleException(msg.toString());
-	}
-
-	/**
-	 * Returns the last module in the ordered set where contextName = &#63;.
-	 *
-	 * @param contextName the context name
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the last matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByContextName_Last(String contextName,
-		OrderByComparator orderByComparator) throws SystemException {
-		int count = countByContextName(contextName);
-
-		if (count == 0) {
-			return null;
-		}
-
-		List<Module> list = findByContextName(contextName, count - 1, count,
-				orderByComparator);
-
-		if (!list.isEmpty()) {
-			return list.get(0);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the modules before and after the current module in the ordered set where contextName = &#63;.
-	 *
-	 * @param moduleId the primary key of the current module
-	 * @param contextName the context name
-	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
-	 * @return the previous, current, and next module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module[] findByContextName_PrevAndNext(long moduleId,
-		String contextName, OrderByComparator orderByComparator)
-		throws NoSuchModuleException, SystemException {
-		Module module = findByPrimaryKey(moduleId);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			Module[] array = new ModuleImpl[3];
-
-			array[0] = getByContextName_PrevAndNext(session, module,
-					contextName, orderByComparator, true);
-
-			array[1] = module;
-
-			array[2] = getByContextName_PrevAndNext(session, module,
-					contextName, orderByComparator, false);
-
-			return array;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	protected Module getByContextName_PrevAndNext(Session session,
-		Module module, String contextName, OrderByComparator orderByComparator,
-		boolean previous) {
-		StringBundler query = null;
-
-		if (orderByComparator != null) {
-			query = new StringBundler(6 +
-					(orderByComparator.getOrderByFields().length * 6));
-		}
-		else {
-			query = new StringBundler(3);
-		}
-
-		query.append(_SQL_SELECT_MODULE_WHERE);
-
-		boolean bindContextName = false;
-
-		if (contextName == null) {
-			query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_1);
-		}
-		else if (contextName.equals(StringPool.BLANK)) {
-			query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_3);
-		}
-		else {
-			bindContextName = true;
-
-			query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_2);
-		}
-
-		if (orderByComparator != null) {
-			String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();
-
-			if (orderByConditionFields.length > 0) {
-				query.append(WHERE_AND);
-			}
-
-			for (int i = 0; i < orderByConditionFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByConditionFields[i]);
-
-				if ((i + 1) < orderByConditionFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN_HAS_NEXT);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(WHERE_GREATER_THAN);
-					}
-					else {
-						query.append(WHERE_LESSER_THAN);
-					}
-				}
-			}
-
-			query.append(ORDER_BY_CLAUSE);
-
-			String[] orderByFields = orderByComparator.getOrderByFields();
-
-			for (int i = 0; i < orderByFields.length; i++) {
-				query.append(_ORDER_BY_ENTITY_ALIAS);
-				query.append(orderByFields[i]);
-
-				if ((i + 1) < orderByFields.length) {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC_HAS_NEXT);
-					}
-					else {
-						query.append(ORDER_BY_DESC_HAS_NEXT);
-					}
-				}
-				else {
-					if (orderByComparator.isAscending() ^ previous) {
-						query.append(ORDER_BY_ASC);
-					}
-					else {
-						query.append(ORDER_BY_DESC);
-					}
-				}
-			}
-		}
-		else {
-			query.append(ModuleModelImpl.ORDER_BY_JPQL);
-		}
-
-		String sql = query.toString();
-
-		Query q = session.createQuery(sql);
-
-		q.setFirstResult(0);
-		q.setMaxResults(2);
-
-		QueryPos qPos = QueryPos.getInstance(q);
-
-		if (bindContextName) {
-			qPos.add(contextName);
-		}
-
-		if (orderByComparator != null) {
-			Object[] values = orderByComparator.getOrderByConditionValues(module);
-
-			for (Object value : values) {
-				qPos.add(value);
-			}
-		}
-
-		List<Module> list = q.list();
-
-		if (list.size() == 2) {
-			return list.get(1);
-		}
-		else {
-			return null;
-		}
-	}
-
-	/**
-	 * Removes all the modules where contextName = &#63; from the database.
-	 *
-	 * @param contextName the context name
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeByContextName(String contextName)
-		throws SystemException {
-		for (Module module : findByContextName(contextName, QueryUtil.ALL_POS,
-				QueryUtil.ALL_POS, null)) {
-			remove(module);
-		}
-	}
-
-	/**
-	 * Returns the number of modules where contextName = &#63;.
-	 *
-	 * @param contextName the context name
-	 * @return the number of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByContextName(String contextName) throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_CONTEXTNAME;
-
-		Object[] finderArgs = new Object[] { contextName };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(2);
-
-			query.append(_SQL_COUNT_MODULE_WHERE);
-
-			boolean bindContextName = false;
-
-			if (contextName == null) {
-				query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_1);
-			}
-			else if (contextName.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_3);
-			}
-			else {
-				bindContextName = true;
-
-				query.append(_FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_2);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				if (bindContextName) {
-					qPos.add(contextName);
-				}
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_1 = "module.contextName IS NULL";
-	private static final String _FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_2 = "module.contextName = ?";
-	private static final String _FINDER_COLUMN_CONTEXTNAME_CONTEXTNAME_3 = "(module.contextName IS NULL OR module.contextName = '')";
-	public static final FinderPath FINDER_PATH_FETCH_BY_A_C = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, ModuleImpl.class,
-			FINDER_CLASS_NAME_ENTITY, "fetchByA_C",
-			new String[] { Long.class.getName(), String.class.getName() },
-			ModuleModelImpl.APPID_COLUMN_BITMASK |
-			ModuleModelImpl.CONTEXTNAME_COLUMN_BITMASK);
-	public static final FinderPath FINDER_PATH_COUNT_BY_A_C = new FinderPath(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleModelImpl.FINDER_CACHE_ENABLED, Long.class,
-			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByA_C",
-			new String[] { Long.class.getName(), String.class.getName() });
-
-	/**
-	 * Returns the module where appId = &#63; and contextName = &#63; or throws a {@link com.liferay.marketplace.NoSuchModuleException} if it could not be found.
-	 *
-	 * @param appId the app ID
-	 * @param contextName the context name
-	 * @return the matching module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByA_C(long appId, String contextName)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByA_C(appId, contextName);
-
-		if (module == null) {
-			StringBundler msg = new StringBundler(6);
-
-			msg.append(_NO_SUCH_ENTITY_WITH_KEY);
-
-			msg.append("appId=");
-			msg.append(appId);
-
-			msg.append(", contextName=");
-			msg.append(contextName);
-
-			msg.append(StringPool.CLOSE_CURLY_BRACE);
-
-			if (_log.isWarnEnabled()) {
-				_log.warn(msg.toString());
-			}
-
-			throw new NoSuchModuleException(msg.toString());
-		}
-
-		return module;
-	}
-
-	/**
-	 * Returns the module where appId = &#63; and contextName = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
-	 *
-	 * @param appId the app ID
-	 * @param contextName the context name
-	 * @return the matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByA_C(long appId, String contextName)
-		throws SystemException {
-		return fetchByA_C(appId, contextName, true);
-	}
-
-	/**
-	 * Returns the module where appId = &#63; and contextName = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
-	 *
-	 * @param appId the app ID
-	 * @param contextName the context name
-	 * @param retrieveFromCache whether to use the finder cache
-	 * @return the matching module, or <code>null</code> if a matching module could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByA_C(long appId, String contextName,
-		boolean retrieveFromCache) throws SystemException {
-		Object[] finderArgs = new Object[] { appId, contextName };
-
-		Object result = null;
-
-		if (retrieveFromCache) {
-			result = FinderCacheUtil.getResult(FINDER_PATH_FETCH_BY_A_C,
-					finderArgs, this);
-		}
-
-		if (result instanceof Module) {
-			Module module = (Module)result;
-
-			if ((appId != module.getAppId()) ||
-					!Validator.equals(contextName, module.getContextName())) {
-				result = null;
-			}
-		}
-
-		if (result == null) {
-			StringBundler query = new StringBundler(4);
-
-			query.append(_SQL_SELECT_MODULE_WHERE);
-
-			query.append(_FINDER_COLUMN_A_C_APPID_2);
-
-			boolean bindContextName = false;
-
-			if (contextName == null) {
-				query.append(_FINDER_COLUMN_A_C_CONTEXTNAME_1);
-			}
-			else if (contextName.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_A_C_CONTEXTNAME_3);
-			}
-			else {
-				bindContextName = true;
-
-				query.append(_FINDER_COLUMN_A_C_CONTEXTNAME_2);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(appId);
-
-				if (bindContextName) {
-					qPos.add(contextName);
-				}
-
-				List<Module> list = q.list();
-
-				if (list.isEmpty()) {
-					FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_A_C,
-						finderArgs, list);
-				}
-				else {
-					if ((list.size() > 1) && _log.isWarnEnabled()) {
-						_log.warn(
-							"ModulePersistenceImpl.fetchByA_C(long, String, boolean) with parameters (" +
-							StringUtil.merge(finderArgs) +
-							") yields a result set with more than 1 result. This violates the logical unique restriction. There is no order guarantee on which result is returned by this finder.");
-					}
-
-					Module module = list.get(0);
-
-					result = module;
-
-					cacheResult(module);
-
-					if ((module.getAppId() != appId) ||
-							(module.getContextName() == null) ||
-							!module.getContextName().equals(contextName)) {
-						FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_A_C,
-							finderArgs, module);
-					}
-				}
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(FINDER_PATH_FETCH_BY_A_C,
-					finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		if (result instanceof List<?>) {
-			return null;
-		}
-		else {
-			return (Module)result;
-		}
-	}
-
-	/**
-	 * Removes the module where appId = &#63; and contextName = &#63; from the database.
-	 *
-	 * @param appId the app ID
-	 * @param contextName the context name
-	 * @return the module that was removed
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module removeByA_C(long appId, String contextName)
-		throws NoSuchModuleException, SystemException {
-		Module module = findByA_C(appId, contextName);
-
-		return remove(module);
-	}
-
-	/**
-	 * Returns the number of modules where appId = &#63; and contextName = &#63;.
-	 *
-	 * @param appId the app ID
-	 * @param contextName the context name
-	 * @return the number of matching modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countByA_C(long appId, String contextName)
-		throws SystemException {
-		FinderPath finderPath = FINDER_PATH_COUNT_BY_A_C;
-
-		Object[] finderArgs = new Object[] { appId, contextName };
-
-		Long count = (Long)FinderCacheUtil.getResult(finderPath, finderArgs,
-				this);
-
-		if (count == null) {
-			StringBundler query = new StringBundler(3);
-
-			query.append(_SQL_COUNT_MODULE_WHERE);
-
-			query.append(_FINDER_COLUMN_A_C_APPID_2);
-
-			boolean bindContextName = false;
-
-			if (contextName == null) {
-				query.append(_FINDER_COLUMN_A_C_CONTEXTNAME_1);
-			}
-			else if (contextName.equals(StringPool.BLANK)) {
-				query.append(_FINDER_COLUMN_A_C_CONTEXTNAME_3);
-			}
-			else {
-				bindContextName = true;
-
-				query.append(_FINDER_COLUMN_A_C_CONTEXTNAME_2);
-			}
-
-			String sql = query.toString();
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				QueryPos qPos = QueryPos.getInstance(q);
-
-				qPos.add(appId);
-
-				if (bindContextName) {
-					qPos.add(contextName);
-				}
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	private static final String _FINDER_COLUMN_A_C_APPID_2 = "module.appId = ? AND ";
-	private static final String _FINDER_COLUMN_A_C_CONTEXTNAME_1 = "module.contextName IS NULL";
-	private static final String _FINDER_COLUMN_A_C_CONTEXTNAME_2 = "module.contextName = ?";
-	private static final String _FINDER_COLUMN_A_C_CONTEXTNAME_3 = "(module.contextName IS NULL OR module.contextName = '')";
-
-	public ModulePersistenceImpl() {
-		setModelClass(Module.class);
-	}
-
-	/**
-	 * Caches the module in the entity cache if it is enabled.
-	 *
-	 * @param module the module
-	 */
-	@Override
-	public void cacheResult(Module module) {
-		EntityCacheUtil.putResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleImpl.class, module.getPrimaryKey(), module);
-
-		FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_A_C,
-			new Object[] { module.getAppId(), module.getContextName() }, module);
-
-		module.resetOriginalValues();
-	}
-
-	/**
-	 * Caches the modules in the entity cache if it is enabled.
-	 *
-	 * @param modules the modules
-	 */
-	@Override
-	public void cacheResult(List<Module> modules) {
-		for (Module module : modules) {
-			if (EntityCacheUtil.getResult(
-						ModuleModelImpl.ENTITY_CACHE_ENABLED, ModuleImpl.class,
-						module.getPrimaryKey()) == null) {
-				cacheResult(module);
-			}
-			else {
-				module.resetOriginalValues();
-			}
-		}
-	}
-
-	/**
-	 * Clears the cache for all modules.
-	 *
-	 * <p>
-	 * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
-	 * </p>
-	 */
-	@Override
-	public void clearCache() {
-		if (_HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE) {
-			CacheRegistryUtil.clear(ModuleImpl.class.getName());
-		}
-
-		EntityCacheUtil.clearCache(ModuleImpl.class.getName());
-
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_ENTITY);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-	}
-
-	/**
-	 * Clears the cache for the module.
-	 *
-	 * <p>
-	 * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
-	 * </p>
-	 */
-	@Override
-	public void clearCache(Module module) {
-		EntityCacheUtil.removeResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleImpl.class, module.getPrimaryKey());
-
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-
-		clearUniqueFindersCache(module);
-	}
-
-	@Override
-	public void clearCache(List<Module> modules) {
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-
-		for (Module module : modules) {
-			EntityCacheUtil.removeResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-				ModuleImpl.class, module.getPrimaryKey());
-
-			clearUniqueFindersCache(module);
-		}
-	}
-
-	protected void cacheUniqueFindersCache(Module module) {
-		if (module.isNew()) {
-			Object[] args = new Object[] {
-					module.getAppId(), module.getContextName()
-				};
-
-			FinderCacheUtil.putResult(FINDER_PATH_COUNT_BY_A_C, args,
-				Long.valueOf(1));
-			FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_A_C, args, module);
-		}
-		else {
-			ModuleModelImpl moduleModelImpl = (ModuleModelImpl)module;
-
-			if ((moduleModelImpl.getColumnBitmask() &
-					FINDER_PATH_FETCH_BY_A_C.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] {
-						module.getAppId(), module.getContextName()
-					};
-
-				FinderCacheUtil.putResult(FINDER_PATH_COUNT_BY_A_C, args,
-					Long.valueOf(1));
-				FinderCacheUtil.putResult(FINDER_PATH_FETCH_BY_A_C, args, module);
-			}
-		}
-	}
-
-	protected void clearUniqueFindersCache(Module module) {
-		ModuleModelImpl moduleModelImpl = (ModuleModelImpl)module;
-
-		Object[] args = new Object[] { module.getAppId(), module.getContextName() };
-
-		FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_A_C, args);
-		FinderCacheUtil.removeResult(FINDER_PATH_FETCH_BY_A_C, args);
-
-		if ((moduleModelImpl.getColumnBitmask() &
-				FINDER_PATH_FETCH_BY_A_C.getColumnBitmask()) != 0) {
-			args = new Object[] {
-					moduleModelImpl.getOriginalAppId(),
-					moduleModelImpl.getOriginalContextName()
-				};
-
-			FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_A_C, args);
-			FinderCacheUtil.removeResult(FINDER_PATH_FETCH_BY_A_C, args);
-		}
-	}
-
-	/**
-	 * Creates a new module with the primary key. Does not add the module to the database.
-	 *
-	 * @param moduleId the primary key for the new module
-	 * @return the new module
-	 */
-	@Override
-	public Module create(long moduleId) {
-		Module module = new ModuleImpl();
-
-		module.setNew(true);
-		module.setPrimaryKey(moduleId);
-
-		String uuid = PortalUUIDUtil.generate();
-
-		module.setUuid(uuid);
-
-		return module;
-	}
-
-	/**
-	 * Removes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param moduleId the primary key of the module
-	 * @return the module that was removed
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module remove(long moduleId)
-		throws NoSuchModuleException, SystemException {
-		return remove((Serializable)moduleId);
-	}
-
-	/**
-	 * Removes the module with the primary key from the database. Also notifies the appropriate model listeners.
-	 *
-	 * @param primaryKey the primary key of the module
-	 * @return the module that was removed
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module remove(Serializable primaryKey)
-		throws NoSuchModuleException, SystemException {
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			Module module = (Module)session.get(ModuleImpl.class, primaryKey);
-
-			if (module == null) {
-				if (_log.isWarnEnabled()) {
-					_log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
-				}
-
-				throw new NoSuchModuleException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
-					primaryKey);
-			}
-
-			return remove(module);
-		}
-		catch (NoSuchModuleException nsee) {
-			throw nsee;
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-	}
-
-	@Override
-	protected Module removeImpl(Module module) throws SystemException {
-		module = toUnwrappedModel(module);
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			if (!session.contains(module)) {
-				module = (Module)session.get(ModuleImpl.class,
-						module.getPrimaryKeyObj());
-			}
-
-			if (module != null) {
-				session.delete(module);
-			}
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-
-		if (module != null) {
-			clearCache(module);
-		}
-
-		return module;
-	}
-
-	@Override
-	public Module updateImpl(com.liferay.marketplace.model.Module module)
-		throws SystemException {
-		module = toUnwrappedModel(module);
-
-		boolean isNew = module.isNew();
-
-		ModuleModelImpl moduleModelImpl = (ModuleModelImpl)module;
-
-		if (Validator.isNull(module.getUuid())) {
-			String uuid = PortalUUIDUtil.generate();
-
-			module.setUuid(uuid);
-		}
-
-		Session session = null;
-
-		try {
-			session = openSession();
-
-			if (module.isNew()) {
-				session.save(module);
-
-				module.setNew(false);
-			}
-			else {
-				session.merge(module);
-			}
-		}
-		catch (Exception e) {
-			throw processException(e);
-		}
-		finally {
-			closeSession(session);
-		}
-
-		FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-
-		if (isNew || !ModuleModelImpl.COLUMN_BITMASK_ENABLED) {
-			FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-		}
-
-		else {
-			if ((moduleModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] { moduleModelImpl.getOriginalUuid() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
-					args);
-
-				args = new Object[] { moduleModelImpl.getUuid() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
-					args);
-			}
-
-			if ((moduleModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_APPID.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] { moduleModelImpl.getOriginalAppId() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_APPID, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_APPID,
-					args);
-
-				args = new Object[] { moduleModelImpl.getAppId() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_APPID, args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_APPID,
-					args);
-			}
-
-			if ((moduleModelImpl.getColumnBitmask() &
-					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CONTEXTNAME.getColumnBitmask()) != 0) {
-				Object[] args = new Object[] {
-						moduleModelImpl.getOriginalContextName()
-					};
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_CONTEXTNAME,
-					args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CONTEXTNAME,
-					args);
-
-				args = new Object[] { moduleModelImpl.getContextName() };
-
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_CONTEXTNAME,
-					args);
-				FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_CONTEXTNAME,
-					args);
-			}
-		}
-
-		EntityCacheUtil.putResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-			ModuleImpl.class, module.getPrimaryKey(), module);
-
-		clearUniqueFindersCache(module);
-		cacheUniqueFindersCache(module);
-
-		return module;
-	}
-
-	protected Module toUnwrappedModel(Module module) {
-		if (module instanceof ModuleImpl) {
-			return module;
-		}
-
-		ModuleImpl moduleImpl = new ModuleImpl();
-
-		moduleImpl.setNew(module.isNew());
-		moduleImpl.setPrimaryKey(module.getPrimaryKey());
-
-		moduleImpl.setUuid(module.getUuid());
-		moduleImpl.setModuleId(module.getModuleId());
-		moduleImpl.setAppId(module.getAppId());
-		moduleImpl.setContextName(module.getContextName());
-
-		return moduleImpl;
-	}
-
-	/**
-	 * Returns the module with the primary key or throws a {@link com.liferay.portal.NoSuchModelException} if it could not be found.
-	 *
-	 * @param primaryKey the primary key of the module
-	 * @return the module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByPrimaryKey(Serializable primaryKey)
-		throws NoSuchModuleException, SystemException {
-		Module module = fetchByPrimaryKey(primaryKey);
-
-		if (module == null) {
-			if (_log.isWarnEnabled()) {
-				_log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
-			}
-
-			throw new NoSuchModuleException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
-				primaryKey);
-		}
-
-		return module;
-	}
-
-	/**
-	 * Returns the module with the primary key or throws a {@link com.liferay.marketplace.NoSuchModuleException} if it could not be found.
-	 *
-	 * @param moduleId the primary key of the module
-	 * @return the module
-	 * @throws com.liferay.marketplace.NoSuchModuleException if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module findByPrimaryKey(long moduleId)
-		throws NoSuchModuleException, SystemException {
-		return findByPrimaryKey((Serializable)moduleId);
-	}
-
-	/**
-	 * Returns the module with the primary key or returns <code>null</code> if it could not be found.
-	 *
-	 * @param primaryKey the primary key of the module
-	 * @return the module, or <code>null</code> if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByPrimaryKey(Serializable primaryKey)
-		throws SystemException {
-		Module module = (Module)EntityCacheUtil.getResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-				ModuleImpl.class, primaryKey);
-
-		if (module == _nullModule) {
-			return null;
-		}
-
-		if (module == null) {
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				module = (Module)session.get(ModuleImpl.class, primaryKey);
-
-				if (module != null) {
-					cacheResult(module);
-				}
-				else {
-					EntityCacheUtil.putResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-						ModuleImpl.class, primaryKey, _nullModule);
-				}
-			}
-			catch (Exception e) {
-				EntityCacheUtil.removeResult(ModuleModelImpl.ENTITY_CACHE_ENABLED,
-					ModuleImpl.class, primaryKey);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return module;
-	}
-
-	/**
-	 * Returns the module with the primary key or returns <code>null</code> if it could not be found.
-	 *
-	 * @param moduleId the primary key of the module
-	 * @return the module, or <code>null</code> if a module with the primary key could not be found
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public Module fetchByPrimaryKey(long moduleId) throws SystemException {
-		return fetchByPrimaryKey((Serializable)moduleId);
-	}
-
-	/**
-	 * Returns all the modules.
-	 *
-	 * @return the modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findAll() throws SystemException {
-		return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
-	}
-
-	/**
-	 * Returns a range of all the modules.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @return the range of modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findAll(int start, int end) throws SystemException {
-		return findAll(start, end, null);
-	}
-
-	/**
-	 * Returns an ordered range of all the modules.
-	 *
-	 * <p>
-	 * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link com.liferay.marketplace.model.impl.ModuleModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
-	 * </p>
-	 *
-	 * @param start the lower bound of the range of modules
-	 * @param end the upper bound of the range of modules (not inclusive)
-	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
-	 * @return the ordered range of modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public List<Module> findAll(int start, int end,
-		OrderByComparator orderByComparator) throws SystemException {
-		boolean pagination = true;
-		FinderPath finderPath = null;
-		Object[] finderArgs = null;
-
-		if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
-				(orderByComparator == null)) {
-			pagination = false;
-			finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL;
-			finderArgs = FINDER_ARGS_EMPTY;
-		}
-		else {
-			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_ALL;
-			finderArgs = new Object[] { start, end, orderByComparator };
-		}
-
-		List<Module> list = (List<Module>)FinderCacheUtil.getResult(finderPath,
-				finderArgs, this);
-
-		if (list == null) {
-			StringBundler query = null;
-			String sql = null;
-
-			if (orderByComparator != null) {
-				query = new StringBundler(2 +
-						(orderByComparator.getOrderByFields().length * 3));
-
-				query.append(_SQL_SELECT_MODULE);
-
-				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
-					orderByComparator);
-
-				sql = query.toString();
-			}
-			else {
-				sql = _SQL_SELECT_MODULE;
-
-				if (pagination) {
-					sql = sql.concat(ModuleModelImpl.ORDER_BY_JPQL);
-				}
-			}
-
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(sql);
-
-				if (!pagination) {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end, false);
-
-					Collections.sort(list);
-
-					list = new UnmodifiableList<Module>(list);
-				}
-				else {
-					list = (List<Module>)QueryUtil.list(q, getDialect(), start,
-							end);
-				}
-
-				cacheResult(list);
-
-				FinderCacheUtil.putResult(finderPath, finderArgs, list);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(finderPath, finderArgs);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return list;
-	}
-
-	/**
-	 * Removes all the modules from the database.
-	 *
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public void removeAll() throws SystemException {
-		for (Module module : findAll()) {
-			remove(module);
-		}
-	}
-
-	/**
-	 * Returns the number of modules.
-	 *
-	 * @return the number of modules
-	 * @throws SystemException if a system exception occurred
-	 */
-	@Override
-	public int countAll() throws SystemException {
-		Long count = (Long)FinderCacheUtil.getResult(FINDER_PATH_COUNT_ALL,
-				FINDER_ARGS_EMPTY, this);
-
-		if (count == null) {
-			Session session = null;
-
-			try {
-				session = openSession();
-
-				Query q = session.createQuery(_SQL_COUNT_MODULE);
-
-				count = (Long)q.uniqueResult();
-
-				FinderCacheUtil.putResult(FINDER_PATH_COUNT_ALL,
-					FINDER_ARGS_EMPTY, count);
-			}
-			catch (Exception e) {
-				FinderCacheUtil.removeResult(FINDER_PATH_COUNT_ALL,
-					FINDER_ARGS_EMPTY);
-
-				throw processException(e);
-			}
-			finally {
-				closeSession(session);
-			}
-		}
-
-		return count.intValue();
-	}
-
-	@Override
-	protected Set<String> getBadColumnNames() {
-		return _badColumnNames;
-	}
-
-	/**
-	 * Initializes the module persistence.
-	 */
-	public void afterPropertiesSet() {
-		String[] listenerClassNames = StringUtil.split(GetterUtil.getString(
-					com.liferay.util.service.ServiceProps.get(
-						"value.object.listener.com.liferay.marketplace.model.Module")));
-
-		if (listenerClassNames.length > 0) {
-			try {
-				List<ModelListener<Module>> listenersList = new ArrayList<ModelListener<Module>>();
-
-				for (String listenerClassName : listenerClassNames) {
-					listenersList.add((ModelListener<Module>)InstanceFactory.newInstance(
-							getClassLoader(), listenerClassName));
-				}
-
-				listeners = listenersList.toArray(new ModelListener[listenersList.size()]);
-			}
-			catch (Exception e) {
-				_log.error(e);
-			}
-		}
-	}
-
-	public void destroy() {
-		EntityCacheUtil.removeCache(ModuleImpl.class.getName());
-		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_ENTITY);
-		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
-		FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
-	}
-
-	private static final String _SQL_SELECT_MODULE = "SELECT module FROM Module module";
-	private static final String _SQL_SELECT_MODULE_WHERE = "SELECT module FROM Module module WHERE ";
-	private static final String _SQL_COUNT_MODULE = "SELECT COUNT(module) FROM Module module";
-	private static final String _SQL_COUNT_MODULE_WHERE = "SELECT COUNT(module) FROM Module module WHERE ";
-	private static final String _ORDER_BY_ENTITY_ALIAS = "module.";
-	private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No Module exists with the primary key ";
-	private static final String _NO_SUCH_ENTITY_WITH_KEY = "No Module exists with the key {";
-	private static final boolean _HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE = GetterUtil.getBoolean(PropsUtil.get(
-				PropsKeys.HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE));
-	private static Log _log = LogFactoryUtil.getLog(ModulePersistenceImpl.class);
-	private static Set<String> _badColumnNames = SetUtil.fromArray(new String[] {
-				"uuid"
-			});
-	private static Module _nullModule = new ModuleImpl() {
-			@Override
-			public Object clone() {
-				return this;
-			}
-
-			@Override
-			public CacheModel<Module> toCacheModel() {
-				return _nullModuleCacheModel;
-			}
-		};
-
-	private static CacheModel<Module> _nullModuleCacheModel = new CacheModel<Module>() {
-			@Override
-			public Module toEntityModel() {
-				return _nullModule;
-			}
-		};
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/store/portlet/StoreControlPanelEntry.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/store/portlet/StoreControlPanelEntry.java
deleted file mode 100644
index 631c528..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/store/portlet/StoreControlPanelEntry.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.store.portlet;
-
-import com.liferay.marketplace.util.PortletPropsValues;
-import com.liferay.portal.model.Group;
-import com.liferay.portal.model.Portlet;
-import com.liferay.portal.security.permission.PermissionChecker;
-import com.liferay.portlet.BaseControlPanelEntry;
-
-/**
- * @author Ryan Park
- */
-public class StoreControlPanelEntry extends BaseControlPanelEntry {
-
-	@Override
-	public boolean hasAccessPermission(
-			PermissionChecker permissionChecker, Group group, Portlet portlet)
-		throws Exception {
-
-		if (!PortletPropsValues.MARKETPLACE_STORE_ENABLED) {
-			return false;
-		}
-
-		return permissionChecker.isOmniadmin();
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/store/portlet/StorePortlet.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/store/portlet/StorePortlet.java
deleted file mode 100644
index 77ad529..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/store/portlet/StorePortlet.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.store.portlet;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.marketplace.service.AppLocalServiceUtil;
-import com.liferay.marketplace.service.AppServiceUtil;
-import com.liferay.marketplace.util.MarketplaceUtil;
-import com.liferay.portal.kernel.json.JSONFactoryUtil;
-import com.liferay.portal.kernel.json.JSONObject;
-import com.liferay.portal.kernel.util.Constants;
-import com.liferay.portal.kernel.util.FileUtil;
-import com.liferay.portal.kernel.util.HttpUtil;
-import com.liferay.portal.kernel.util.ParamUtil;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.kernel.util.WebKeys;
-import com.liferay.portal.model.User;
-import com.liferay.portal.theme.ThemeDisplay;
-import com.liferay.portal.util.PortalUtil;
-import com.liferay.portlet.expando.service.ExpandoValueLocalServiceUtil;
-import com.liferay.util.bridges.mvc.MVCPortlet;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-import java.net.URL;
-
-import java.util.Map;
-import java.util.Set;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletException;
-
-/**
- * @author Ryan Park
- */
-public class StorePortlet extends MVCPortlet {
-
-	public void downloadApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
-			WebKeys.THEME_DISPLAY);
-
-		String token = ParamUtil.getString(actionRequest, "token");
-		long remoteAppId = ParamUtil.getLong(actionRequest, "appId");
-		String url = ParamUtil.getString(actionRequest, "url");
-		String version = ParamUtil.getString(actionRequest, "version");
-
-		url = getRemoteAppPackageURL(
-			themeDisplay.getCompanyId(), themeDisplay.getUserId(), token, url);
-
-		URL urlObj = new URL(url);
-
-		File tempFile = null;
-
-		try {
-			InputStream inputStream = urlObj.openStream();
-
-			tempFile = FileUtil.createTempFile();
-
-			FileUtil.write(tempFile, inputStream);
-
-			App app = AppServiceUtil.updateApp(remoteAppId, version, tempFile);
-
-			JSONObject jsonObject = getAppJSONObject(app.getRemoteAppId());
-
-			jsonObject.put("cmd", "downloadApp");
-			jsonObject.put("message", "success");
-
-			writeJSON(actionRequest, actionResponse, jsonObject);
-		}
-		finally {
-			if (tempFile != null) {
-				tempFile.delete();
-			}
-		}
-	}
-
-	public void getApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		long remoteAppId = ParamUtil.getLong(actionRequest, "appId");
-
-		JSONObject jsonObject = getAppJSONObject(remoteAppId);
-
-		jsonObject.put("cmd", "getApp");
-		jsonObject.put("message", "success");
-
-		writeJSON(actionRequest, actionResponse, jsonObject);
-	}
-
-	public void getBundledApps(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
-
-		Map<String, String> bundledApps = AppLocalServiceUtil.getBundledApps();
-
-		JSONObject bundledAppJsonObject = JSONFactoryUtil.createJSONObject();
-
-		Set<String> keys = bundledApps.keySet();
-
-		for (String key : keys) {
-			bundledAppJsonObject.put(key, bundledApps.get(key));
-		}
-
-		jsonObject.put("bundledApps", bundledAppJsonObject);
-
-		jsonObject.put("cmd", "getBundledApps");
-		jsonObject.put("message", "success");
-
-		writeJSON(actionRequest, actionResponse, jsonObject);
-	}
-
-	public void getClientId(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
-			WebKeys.THEME_DISPLAY);
-
-		String token = ParamUtil.getString(actionRequest, "token");
-
-		String encodedClientId = MarketplaceUtil.encodeClientId(
-			themeDisplay.getCompanyId(), themeDisplay.getUserId(), token);
-
-		JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
-
-		jsonObject.put("cmd", "getClientId");
-		jsonObject.put("clientId", encodedClientId);
-		jsonObject.put("token", token);
-
-		writeJSON(actionRequest, actionResponse, jsonObject);
-	}
-
-	public void installApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		long remoteAppId = ParamUtil.getLong(actionRequest, "appId");
-
-		AppServiceUtil.installApp(remoteAppId);
-
-		JSONObject jsonObject = getAppJSONObject(remoteAppId);
-
-		jsonObject.put("cmd", "installApp");
-		jsonObject.put("message", "success");
-
-		writeJSON(actionRequest, actionResponse, jsonObject);
-	}
-
-	@Override
-	public void processAction(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws IOException {
-
-		try {
-			if (!isProcessActionRequest(actionRequest)) {
-				return;
-			}
-
-			if (!callActionMethod(actionRequest, actionResponse)) {
-				return;
-			}
-		}
-		catch (PortletException pe) {
-			JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
-
-			jsonObject.put("message", "fail");
-
-			writeJSON(actionRequest, actionResponse, jsonObject);
-		}
-	}
-
-	public void uninstallApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		long remoteAppId = ParamUtil.getLong(actionRequest, "appId");
-
-		AppServiceUtil.uninstallApp(remoteAppId);
-
-		JSONObject jsonObject = getAppJSONObject(remoteAppId);
-
-		jsonObject.put("cmd", "uninstallApp");
-		jsonObject.put("message", "success");
-
-		writeJSON(actionRequest, actionResponse, jsonObject);
-	}
-
-	public void updateApp(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
-			WebKeys.THEME_DISPLAY);
-
-		String token = ParamUtil.getString(actionRequest, "token");
-		long remoteAppId = ParamUtil.getLong(actionRequest, "appId");
-		String version = ParamUtil.getString(actionRequest, "version");
-		String url = ParamUtil.getString(actionRequest, "url");
-
-		url = getRemoteAppPackageURL(
-			themeDisplay.getCompanyId(), themeDisplay.getUserId(), token, url);
-
-		URL urlObj = new URL(url);
-
-		File tempFile = null;
-
-		try {
-			InputStream inputStream = urlObj.openStream();
-
-			tempFile = FileUtil.createTempFile();
-
-			FileUtil.write(tempFile, inputStream);
-
-			AppServiceUtil.updateApp(remoteAppId, version, tempFile);
-
-			AppServiceUtil.installApp(remoteAppId);
-
-			JSONObject jsonObject = getAppJSONObject(remoteAppId);
-
-			jsonObject.put("cmd", "updateApp");
-			jsonObject.put("message", "success");
-
-			writeJSON(actionRequest, actionResponse, jsonObject);
-		}
-		finally {
-			if (tempFile != null) {
-				tempFile.delete();
-			}
-		}
-	}
-
-	public void updateClientId(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws Exception {
-
-		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
-			WebKeys.THEME_DISPLAY);
-
-		if (!themeDisplay.isSignedIn()) {
-			return;
-		}
-
-		String clientId = ParamUtil.getString(actionRequest, "clientId");
-		String token = ParamUtil.getString(actionRequest, "token");
-
-		String decodedClientId = MarketplaceUtil.decodeClientId(
-			clientId, token);
-
-		JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
-
-		jsonObject.put("cmd", "updateClientId");
-
-		if (Validator.isNull(decodedClientId)) {
-			jsonObject.put("message", "fail");
-
-			writeJSON(actionRequest, actionResponse, jsonObject);
-
-			return;
-		}
-
-		ExpandoValueLocalServiceUtil.addValue(
-			themeDisplay.getCompanyId(), User.class.getName(), "MP", "clientId",
-			themeDisplay.getUserId(), decodedClientId);
-
-		jsonObject.put("message", "success");
-
-		writeJSON(actionRequest, actionResponse, jsonObject);
-	}
-
-	@Override
-	protected boolean callActionMethod(
-			ActionRequest actionRequest, ActionResponse actionResponse)
-		throws PortletException {
-
-		String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
-
-		if (Validator.isNull(cmd)) {
-			return super.callActionMethod(actionRequest, actionResponse);
-		}
-
-		try {
-			if (cmd.equals("downloadApp")) {
-				downloadApp(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("getApp")) {
-				getApp(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("getBundledApps")) {
-				getBundledApps(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("getClientId")) {
-				getClientId(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("installApp")) {
-				installApp(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("updateApp")) {
-				updateApp(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("updateClientId")) {
-				updateClientId(actionRequest, actionResponse);
-			}
-			else if (cmd.equals("uninstallApp")) {
-				uninstallApp(actionRequest, actionResponse);
-			}
-			else {
-				return super.callActionMethod(actionRequest, actionResponse);
-			}
-		}
-		catch (Exception e) {
-			throw new PortletException(e);
-		}
-
-		return true;
-	}
-
-	protected JSONObject getAppJSONObject(long remoteAppId) throws Exception {
-		JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
-
-		App app = AppLocalServiceUtil.fetchRemoteApp(remoteAppId);
-
-		if (app != null) {
-			jsonObject.put("appId", app.getRemoteAppId());
-			jsonObject.put("downloaded", app.isDownloaded());
-			jsonObject.put("installed", app.isInstalled());
-			jsonObject.put("version", app.getVersion());
-		}
-		else {
-			jsonObject.put("appId", remoteAppId);
-			jsonObject.put("downloaded", false);
-			jsonObject.put("installed", false);
-			jsonObject.put("version", StringPool.BLANK);
-		}
-
-		return jsonObject;
-	}
-
-	protected String getRemoteAppPackageURL(
-			long companyId, long userId, String token, String url)
-		throws Exception {
-
-		String encodedClientId = MarketplaceUtil.encodeClientId(
-			companyId, userId, token);
-
-		url = HttpUtil.addParameter(
-			url, _PORTLET_NAMESPACE.concat("clientId"), encodedClientId);
-		url = HttpUtil.addParameter(
-			url, _PORTLET_NAMESPACE.concat("token"), token);
-
-		return url;
-	}
-
-	private static final String _PORTLET_NAMESPACE =
-		PortalUtil.getPortletNamespace("12_WAR_osbportlet");
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/MarketplaceConstants.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/MarketplaceConstants.java
deleted file mode 100644
index a50642a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/MarketplaceConstants.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util;
-
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.portal.kernel.util.ReleaseInfo;
-import com.liferay.portal.kernel.util.StringPool;
-
-/**
- * @author Ryan Park
- */
-public class MarketplaceConstants {
-
-	public static final String MARKETPLACE_URL_LOGOUT = GetterUtil.getString(
-		PortletPropsValues.MARKETPLACE_URL_LOGOUT,
-		"https://mp.liferay.com/c/portal/logout");
-
-	public static String getPathPurchased() {
-		if (_pathPurchased == null) {
-			_pathPurchased =
-				_MARKETPLACE_PATH_PURCHASED + _MARKETPLACE_CLIENT_BUILD +
-					StringPool.SLASH;
-		}
-
-		return _pathPurchased + ReleaseInfo.getBuildNumber();
-	}
-
-	public static String getPathStore() {
-		if (_pathStore == null) {
-			_pathStore =
-				_MARKETPLACE_PATH_STORE + _MARKETPLACE_CLIENT_BUILD +
-					StringPool.SLASH;
-		}
-
-		return _pathStore + ReleaseInfo.getBuildNumber();
-	}
-
-	private static final String _MARKETPLACE_CLIENT_BUILD = "1";
-
-	private static final String _MARKETPLACE_PATH_PURCHASED =
-		"/widget/web/guest/mpserver/-/mp_server/purchased/";
-
-	private static final String _MARKETPLACE_PATH_STORE =
-		"/widget/web/guest/mpserver/-/mp_server/store/";
-
-	private static String _pathPurchased;
-	private static String _pathStore;
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/MarketplaceUtil.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/MarketplaceUtil.java
deleted file mode 100644
index 73658b9..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/MarketplaceUtil.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util;
-
-import com.liferay.portal.kernel.exception.PortalException;
-import com.liferay.portal.kernel.exception.SystemException;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.UnicodeFormatter;
-import com.liferay.portal.kernel.util.Validator;
-import com.liferay.portal.model.User;
-import com.liferay.portlet.expando.service.ExpandoValueLocalServiceUtil;
-
-/**
- * @author Peter Shin
- */
-public class MarketplaceUtil {
-
-	public static String decodeClientId(String encodedClientId, String token) {
-		if (Validator.isNull(encodedClientId) || Validator.isNull(token)) {
-			return StringPool.BLANK;
-		}
-
-		byte[] encodedClientIdBytes = UnicodeFormatter.hexToBytes(
-			encodedClientId);
-
-		if (encodedClientIdBytes.length == 0) {
-			return StringPool.BLANK;
-		}
-
-		return new String(xor(encodedClientIdBytes, token.getBytes()));
-	}
-
-	public static String encodeClientId(
-			long companyId, long userId, String token)
-		throws PortalException, SystemException {
-
-		if (Validator.isNull(token)) {
-			return StringPool.BLANK;
-		}
-
-		String clientId = ExpandoValueLocalServiceUtil.getData(
-			companyId, User.class.getName(), "MP", "clientId", userId,
-			"default-client-id");
-
-		byte[] encodedClientIdBytes = xor(
-			clientId.getBytes(), token.getBytes());
-
-		return UnicodeFormatter.bytesToHex(encodedClientIdBytes);
-	}
-
-	public static boolean hasMarketplaceAdmin(long companyId)
-		throws SystemException {
-
-		int count = ExpandoValueLocalServiceUtil.getColumnValuesCount(
-			companyId, User.class.getName(), "MP", "clientId");
-
-		if (count <= 0) {
-			return false;
-		}
-
-		return true;
-	}
-
-	public static boolean isMarketplaceAdmin(User user)
-		throws PortalException, SystemException {
-
-		String clientId = ExpandoValueLocalServiceUtil.getData(
-			user.getCompanyId(), User.class.getName(), "MP", "clientId",
-			user.getUserId(), StringPool.BLANK);
-
-		if (Validator.isNull(clientId)) {
-			return false;
-		}
-
-		return true;
-	}
-
-	protected static byte[] xor(byte[] bytes1, byte[] bytes2) {
-		byte[] bytes = new byte[bytes1.length];
-
-		for (int i = 0; i < bytes1.length; i++) {
-			bytes[i] = (byte)(bytes1[i] ^ bytes2[i % bytes2.length]);
-		}
-
-		return bytes;
-	}
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletKeys.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletKeys.java
deleted file mode 100644
index 8ad2c76..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletKeys.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util;
-
-/**
- * @author Ryan Park
- */
-public class PortletKeys extends com.liferay.portal.util.PortletKeys {
-
-	public static final String MY_MARKETPLACE = "2_WAR_marketplaceportlet";
-
-	public static final String STORE = "1_WAR_marketplaceportlet";
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletPropsKeys.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletPropsKeys.java
deleted file mode 100644
index 9edca73..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletPropsKeys.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util;
-
-/**
- * @author Ryan Park
- */
-public interface PortletPropsKeys {
-
-	public static final String MARKETPLACE_STORE_ENABLED =
-		"marketplace.store.enabled";
-
-	public static final String MARKETPLACE_URL_LOGOUT =
-		"marketplace.url.logout";
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletPropsValues.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletPropsValues.java
deleted file mode 100644
index b0ef818..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/PortletPropsValues.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util;
-
-import com.liferay.portal.kernel.util.GetterUtil;
-import com.liferay.util.portlet.PortletProps;
-
-/**
- * @author Ryan Park
- */
-public class PortletPropsValues {
-
-	public static final boolean MARKETPLACE_STORE_ENABLED =
-		GetterUtil.getBoolean(
-			PortletProps.get(PortletPropsKeys.MARKETPLACE_STORE_ENABLED), true);
-
-	public static final String MARKETPLACE_URL_LOGOUT = PortletProps.get(
-		PortletPropsKeys.MARKETPLACE_URL_LOGOUT);
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/comparator/AppTitleComparator.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/comparator/AppTitleComparator.java
deleted file mode 100644
index 110f21f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/comparator/AppTitleComparator.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util.comparator;
-
-import com.liferay.marketplace.model.App;
-import com.liferay.portal.kernel.util.OrderByComparator;
-import com.liferay.portal.kernel.util.StringUtil;
-
-/**
- * @author Ryan Park
- */
-public class AppTitleComparator extends OrderByComparator {
-
-	public static final String ORDER_BY_ASC = "title ASC";
-
-	public static final String ORDER_BY_DESC = "title DESC";
-
-	public static final String[] ORDER_BY_FIELDS = {"title"};
-
-	public AppTitleComparator() {
-		this(true);
-	}
-
-	public AppTitleComparator(boolean asc) {
-		_asc = asc;
-	}
-
-	@Override
-	public int compare(Object obj1, Object obj2) {
-		App app1 = (App)obj1;
-		App app2 = (App)obj2;
-
-		int value = StringUtil.toLowerCase(app1.getTitle()).compareTo(
-			StringUtil.toLowerCase(app2.getTitle()));
-
-		if (_asc) {
-			return value;
-		}
-		else {
-			return -value;
-		}
-	}
-
-	@Override
-	public String getOrderBy() {
-		if (_asc) {
-			return ORDER_BY_ASC;
-		}
-		else {
-			return ORDER_BY_DESC;
-		}
-	}
-
-	@Override
-	public String[] getOrderByFields() {
-		return ORDER_BY_FIELDS;
-	}
-
-	@Override
-	public boolean isAscending() {
-		return _asc;
-	}
-
-	private boolean _asc;
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/comparator/PluginComparator.java b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/comparator/PluginComparator.java
deleted file mode 100644
index b196bfa..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/com/liferay/marketplace/util/comparator/PluginComparator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY 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 com.liferay.marketplace.util.comparator;
-
-import com.liferay.portal.kernel.servlet.ServletContextPool;
-import com.liferay.portal.kernel.util.LocaleUtil;
-import com.liferay.portal.kernel.util.StringPool;
-import com.liferay.portal.kernel.util.StringUtil;
-import com.liferay.portal.model.LayoutTemplate;
-import com.liferay.portal.model.Portlet;
-import com.liferay.portal.model.Theme;
-import com.liferay.portal.util.PortalUtil;
-
-import java.io.Serializable;
-
-import java.util.Comparator;
-import java.util.Locale;
-
-import javax.servlet.ServletContext;
-
-/**
- * @author Ryan Park
- */
-public class PluginComparator implements Comparator, Serializable {
-
-	public PluginComparator() {
-		_locale = LocaleUtil.getDefault();
-		_servletContext = ServletContextPool.get(PortalUtil.getPathContext());
-	}
-
-	public PluginComparator(ServletContext servletContext, Locale locale) {
-		_locale = locale;
-		_servletContext = servletContext;
-	}
-
-	@Override
-	public int compare(Object plugin1, Object plugin2) {
-		String name1 = _getName(plugin1);
-		String name2 = _getName(plugin2);
-
-		return name1.compareTo(name2);
-	}
-
-	private String _getName(Object plugin) {
-		String name = StringPool.BLANK;
-
-		if (plugin instanceof LayoutTemplate) {
-			LayoutTemplate layoutTemplate = (LayoutTemplate)plugin;
-
-			name = layoutTemplate.getName();
-		}
-		else if (plugin instanceof Portlet) {
-			Portlet portlet = (Portlet)plugin;
-
-			name = PortalUtil.getPortletTitle(
-				portlet, _servletContext, _locale);
-		}
-		else if (plugin instanceof Theme) {
-			Theme theme = (Theme)plugin;
-
-			name = theme.getName();
-		}
-
-		return StringUtil.toLowerCase(name);
-	}
-
-	private Locale _locale;
-	private ServletContext _servletContext;
-
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language.properties
deleted file mode 100644
index dfdbaa5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps
-app-manager=App Manager
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this?
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product?
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager
-reindex-search=Reindex Search
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app.
-this-app-contains=This app contains:
-this-portlet-is-available-in-my-account=This portlet is available in My Account.
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration.
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ar.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ar.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ar.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_bg.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_bg.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_bg.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ca.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ca.properties
deleted file mode 100644
index ce77923..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ca.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Totes les aplicacions
-app-manager=Gestor de aplicacions
-are-you-sure-you-want-to-uninstall-this=Esteu segur que voleu desinstal·lar aquesta aplicació?
-are-you-sure-you-want-to-uninstall-this-product=Esteu segur que voleu desinstal·lar aquest producte?
-could-not-connect-to-the-liferay-marketplace=No s'ha pogut connectar amb el Marketplace de Liferay.
-file-upload-lpkg-or-war-file=Càrrega de fitxer (LPKG o WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Les aplicacions instal·lades estan disponibles totes les instàncies de portal. Aneu a la configuració de connectors dins de cada instància de portal per a activar/desactivar cada aplicació.
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Gestor de aplicacions
-reindex-search=Reindexa la cerca
-there-are-no-configurable-plugins-for-this-app=No hi ha connectors configurables per a aquesta aplicació.
-this-app-contains=Aquesta aplicació conté:
-this-portlet-is-available-in-my-account=Aquest mòdul de portal està disponible en El teu compte.
-this-portlet-is-available-in-site-administration=Aquest mòdul de portal està disponible en l'Administració del lloc.
-this-portlet-is-available-in-the-control-panel=Aquest mòdul de portal està disponible en el tauler de control.
-unable-to-uninstall-app-or-plugin-because-it-is-required=No s'ha pogut desinstal·lar la aplicació o connector perquè es requereix.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_cs.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_cs.properties
deleted file mode 100644
index 4d29d5e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_cs.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Všechny aplikace
-app-manager=Správce aplikací
-are-you-sure-you-want-to-uninstall-this=Opravdu si přejete odinstalovat tento produkt?
-are-you-sure-you-want-to-uninstall-this-product=Opravdu si přejete odinstalovat tento produkt?
-could-not-connect-to-the-liferay-marketplace=Nepodařilo se připojit do Lifery Marketplace.
-file-upload-lpkg-or-war-file=Nahrání souboru (soubor typu LPKG nebo WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Správce aplikací
-reindex-search=Přeindexovat vyhledávání
-there-are-no-configurable-plugins-for-this-app=Pro tuto aplikaci zde nejsou žádné zásuvné moduly.
-this-app-contains=Tato aplikace obsahuje:
-this-portlet-is-available-in-my-account=Tento portlet je dostupný v sekci Můj účet.
-this-portlet-is-available-in-site-administration=Tento portlet je dostupný v sekci Správa webu.
-this-portlet-is-available-in-the-control-panel=Tento portlet je dostupný v sekci Ovládací panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Nepodařilo se odinstalovat aplikaci nebo zásuvný modul, protože je požadována.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_da.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_da.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_da.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_de.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_de.properties
deleted file mode 100644
index c7301c1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_de.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle Apps
-app-manager=App Manager
-are-you-sure-you-want-to-uninstall-this=Sind Sie sicher, dass Sie diese App deinstallieren möchten?
-are-you-sure-you-want-to-uninstall-this-product=Sind Sie sicher, dass Sie dieses Produkt deinstallieren möchten?
-could-not-connect-to-the-liferay-marketplace=Es konnte keine Verbindung zum Liferay Marketplace hergestellt werden.
-file-upload-lpkg-or-war-file=Datei hochladen (LPKG- oder WAR-Datei)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installierte Apps sind in allen Portalinstanzen verfügbar. Innerhalb der Portletkonfiguration der jeweiligen Instanz können Apps aktiviert oder deaktiviert werden.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Erworben
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager
-reindex-search=Suchindex neu erstellen
-there-are-no-configurable-plugins-for-this-app=Diese App beinhaltet keine konfigurierbaren Plugins.
-this-app-contains=Diese App beinhaltet:
-this-portlet-is-available-in-my-account=Dieses Portlet ist innerhalb von Mein Konto verfügbar.
-this-portlet-is-available-in-site-administration=Dieses Portlet ist innerhalb der Site-Administration verfügbar.
-this-portlet-is-available-in-the-control-panel=Dieses Portlet ist innerhalb des Kontrollbereichs verfügbar.
-unable-to-uninstall-app-or-plugin-because-it-is-required=App oder Plugin kann nicht deinstalliert werden, weil es benötigt wird.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_el.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_el.properties
deleted file mode 100644
index 46aac79..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_el.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Όλα τα Apps (Automatic Translation)
-app-manager=Διαχείριση εφαρμογών (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=Είστε βέβαιοι ότι θέλετε να απεγκαταστήσετε αυτό; (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=Είστε βέβαιοι εσείς θέλετε την απεγκατάσταση αυτό το προϊόν; (Automatic Translation)
-could-not-connect-to-the-liferay-marketplace=Δεν θα μπορούσε να συνδέσει με την αγορά Liferay. (Automatic Translation)
-file-upload-lpkg-or-war-file=Φορτώστε το αρχείο (LPKG ή ΠΌΛΕΜΟΣ αρχείο) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Εγκατεστημένη apps είναι διαθέσιμα σε όλες τις εμφανίσεις πύλης. Πηγαίνετε στο Plugins διαμόρφωση μέσα σε κάθε πύλη παράδειγμα για την ενεργοποίηση/απενεργοποίηση κάθε app. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=Κατάστημα (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Αγοράζονται (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Διαχείριση εφαρμογών (Automatic Translation)
-reindex-search=Αναπροσαρμόσετε Αναζήτηση (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=Υπάρχουν δεν διαμορφώσιμες plugins για αυτό το app. (Automatic Translation)
-this-app-contains=Αυτό το app που περιέχει: (Automatic Translation)
-this-portlet-is-available-in-my-account=Αυτό το portlet είναι διαθέσιμο στο λογαριασμό μου. (Automatic Translation)
-this-portlet-is-available-in-site-administration=Αυτό το portlet είναι διαθέσιμα στη διοίκηση του Site. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=Αυτό το portlet είναι διαθέσιμος στον πίνακα ελέγχου. (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Αδυνατεί να το απεγκαταστήσετε app ή το plugin, επειδή απαιτείται. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_en.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_en.properties
deleted file mode 100644
index dfdbaa5..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_en.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps
-app-manager=App Manager
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this?
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product?
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager
-reindex-search=Reindex Search
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app.
-this-app-contains=This app contains:
-this-portlet-is-available-in-my-account=This portlet is available in My Account.
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration.
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_es.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_es.properties
deleted file mode 100644
index 09e65ed..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_es.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Todas las aplicaciones
-app-manager=Gestor de aplicaciones
-are-you-sure-you-want-to-uninstall-this=¿Está seguro de que desea desinstalar este producto?
-are-you-sure-you-want-to-uninstall-this-product=Está seguro de que desea desinstalar este producto?
-could-not-connect-to-the-liferay-marketplace=No se ha podido establecer la conexión con el Marketplace de Liferay.
-file-upload-lpkg-or-war-file=Cargar fichero (fichero LPKG o WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Las aplicaciones están disponibles para todas las instancias del portal. Ve a Configuración de Plugins en cada instancia para habilitar o deshablitar cada aplicación
-javax.portlet.title.1_WAR_marketplaceportlet=Tienda (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Comprar (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Gestor de aplicaciones
-reindex-search=Reindexar búsqueda
-there-are-no-configurable-plugins-for-this-app=No hay plugins disponibles para esta aplicación
-this-app-contains=Esta aplicación contiene:
-this-portlet-is-available-in-my-account=Este portlet está disponible en Mi Cuenta
-this-portlet-is-available-in-site-administration=Este portlet está disponible en Administración del Sitio
-this-portlet-is-available-in-the-control-panel=Este portlet está disponible en el Panel de Control
-unable-to-uninstall-app-or-plugin-because-it-is-required=No se permite desinstalar la aplicación porque es requerida
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_et.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_et.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_et.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_eu.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_eu.properties
deleted file mode 100644
index 6158169..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_eu.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Ziur al zaude produktu hau desinstalatu nahi duzula?
-are-you-sure-you-want-to-uninstall-this-product=Ziur al zaude produktu hau desinstalatu nahi duzula?
-could-not-connect-to-the-liferay-marketplace=Ezin izan da konektatu Liferay Marketplace-arekin.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fa.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fa.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fa.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fi.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fi.properties
deleted file mode 100644
index 04fd96a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fi.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Kaikki sovellukset
-app-manager=Sovellusten hallinta
-are-you-sure-you-want-to-uninstall-this=Oletko varma, että haluat poistaa tämän tuotteen asennuksen?
-are-you-sure-you-want-to-uninstall-this-product=Oletko varma, että haluat poistaa tämän tuotteen asennuksen?
-could-not-connect-to-the-liferay-marketplace=Liferayn markkinapaikkaan ei saada yhteyttä.
-file-upload-lpkg-or-war-file=Kopioi palvelimelle (LPKG tai WAR tiedosto)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Asennetut sovelluset ovat saatavilla kaikille portaalin ilmentymille. Jokaisessa portaali-ilmentymässä voit kytkeä sovelluksen päälle ja pois, menemällä Sovelluksien asetusnäytölle.
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Sovellusten hallinta
-reindex-search=Indeksoi uudellen.
-there-are-no-configurable-plugins-for-this-app=Tälle sovellukselle ei ole muokattavia laajennoksia.
-this-app-contains=Tämä sovellus sisältää:
-this-portlet-is-available-in-my-account=Tämä sovellus on käytettävissä omilla sivuilla.
-this-portlet-is-available-in-site-administration=Tämä sovellus on käytettävissä Sivuston Hallinnassa.
-this-portlet-is-available-in-the-control-panel=Tämä portlet on käytettävissä Hallintapaneelissa.
-unable-to-uninstall-app-or-plugin-because-it-is-required=En voi poistaa tätä sovellusta, koska sitä tarvitaan.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fr.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fr.properties
deleted file mode 100644
index 090102f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_fr.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Toutes les applications
-app-manager=Le gestionnaire d'applications
-are-you-sure-you-want-to-uninstall-this=Etes-vous de vouloir désinstaller cette application?
-are-you-sure-you-want-to-uninstall-this-product=Êtes-vous sûr de vouloir désinstaller ce produit?
-could-not-connect-to-the-liferay-marketplace=Impossible de se connecter au Market Place Liferay.
-file-upload-lpkg-or-war-file=Téléverser fichier (fichier LPKG ou WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Les applications installées sont disponible à toutes les instance de portail. Allez à configuration de plugin dans chaque instance de portail pour activer/désactier chaque application.
-javax.portlet.title.1_WAR_marketplaceportlet=Magasin (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Acheté (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Le gestionnaire d'applications
-reindex-search=Ré-indexer la recherche
-there-are-no-configurable-plugins-for-this-app=Il n'y a pas de plugins configurable for cette application.
-this-app-contains=Cette application contient:
-this-portlet-is-available-in-my-account=Cette portlet est disponible dans "Mon compte".
-this-portlet-is-available-in-site-administration=Cette portlet est disponible dans "l'Administration de site"
-this-portlet-is-available-in-the-control-panel=Cette portlet est disponible dans le panneau de contrôle.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Impossible de désinstaller l'application ou le plugin, car il est obligatoire.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_gl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_gl.properties
deleted file mode 100644
index 453a9b8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_gl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=¿Estás seguro de que queres desinstalar este producto?
-are-you-sure-you-want-to-uninstall-this-product=¿Estás seguro de que queres desinstalar este producto?
-could-not-connect-to-the-liferay-marketplace=Non se pode conectar a Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hi_IN.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hi_IN.properties
deleted file mode 100644
index a87c5bc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hi_IN.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=सभी क्षुधा (Automatic Translation)
-app-manager=अनुप्रयोग प्रबंधक (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=आप सुनिश्चित करें कि आप यह स्थापना रद्द करने के लिए चाहते हैं? (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=फ़ाइल अपलोड करें (LPKG या युद्ध फ़ाइल) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=स्थापित क्षुधा पोर्टल की सभी आवृत्तियों के लिए उपलब्ध हैं। Plugins विन्यास करने के लिए प्रत्येक पोर्टल उदाहरण के भीतर प्रत्येक अनुप्रयोग सक्षम करें/निष्क्रिय करने के लिए जाओ। (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=स्टोर (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=खरीदी (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=अनुप्रयोग प्रबंधक (Automatic Translation)
-reindex-search=खोज reindex (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=इस अनुप्रयोग के लिए कोई विन्यास plugins रहे हैं। (Automatic Translation)
-this-app-contains=इस app शामिल हैं: (Automatic Translation)
-this-portlet-is-available-in-my-account=इस portlet में मेरा खाता उपलब्ध है। (Automatic Translation)
-this-portlet-is-available-in-site-administration=इस portlet साइट व्यवस्थापन में उपलब्ध है। (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=इस portlet नियंत्रण पैनल में उपलब्ध है। (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=यह आवश्यक है क्योंकि अनुप्रयोग या प्लगइन की स्थापना रद्द करने में असमर्थ। (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hr.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hr.properties
deleted file mode 100644
index d07aacc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hr.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Da li ste sigurni da želite deinstalirati ovaj proizvod?
-are-you-sure-you-want-to-uninstall-this-product=Da li ste sigurni da želite deinstalirati ovaj proizvod?
-could-not-connect-to-the-liferay-marketplace=Nije moguće ostvariti vezu sa Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hu.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hu.properties
deleted file mode 100644
index 0aa3281..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_hu.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Minden alkalmazás
-app-manager=Alkalmazás menedzser
-are-you-sure-you-want-to-uninstall-this=Biztos, hogy törölni akarod ezt?
-are-you-sure-you-want-to-uninstall-this-product=Biztos, hogy törölni akarod ezt a terméket?
-could-not-connect-to-the-liferay-marketplace=Nem lehetséges a Liferay Marketplace-hez kapcsolódni.
-file-upload-lpkg-or-war-file=Fájl feltöltés (LPKG vagy WAR fájl)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=A telepített alkalmazások elérhetőek az összes portál példányban. Menj a Betelepülők Beállításába az egyes portál példányokban, hogy engedélyezhesd vagy letilthasd az egyes alkalmazásokat.
-javax.portlet.title.1_WAR_marketplaceportlet=Raktár
-javax.portlet.title.2_WAR_marketplaceportlet=Megvásárolva
-javax.portlet.title.3_WAR_marketplaceportlet=Alkalmazás menedzser
-reindex-search=Keresés újraindexelése
-there-are-no-configurable-plugins-for-this-app=Nincsenek konfigurálható bővítmények ehhez az alkalmazáshoz.
-this-app-contains=Ez az alkalmazás a következőket tartalmazza:
-this-portlet-is-available-in-my-account=A portlet elérhető a Saját fiókban.
-this-portlet-is-available-in-site-administration=A portlet elérhető a Webhely adminisztrációban.
-this-portlet-is-available-in-the-control-panel=Ez a portlet elérhető a Vezérlőközpontban.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Nem lehet eltávolítani az alkalmazást vagy beépülő modult, mert az kötelező.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_in.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_in.properties
deleted file mode 100644
index 67a0a2a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_in.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Apakah anda yakin ingin menghapus produk ini?
-are-you-sure-you-want-to-uninstall-this-product=Apakah anda yakin ingin menghapus produk ini?
-could-not-connect-to-the-liferay-marketplace=Tidak dapat terhubung ke Marketplace Liferay.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_it.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_it.properties
deleted file mode 100644
index af3c983..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_it.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Tutte le App
-app-manager=Gestore delle App
-are-you-sure-you-want-to-uninstall-this=Sicuro di volerlo disinstallare?
-are-you-sure-you-want-to-uninstall-this-product=Sicuro di voler disinstallare questo prodotto?
-could-not-connect-to-the-liferay-marketplace=Collegamento al Marketplace Liferay non riuscito.
-file-upload-lpkg-or-war-file=Caricamento File (LPKG o WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Le applicazioni installate sono accessibili a tutte le istanze di portale. Vai a Configurazione Plugins in ogni istanza di portale per abilitare/disabilitare ogni applicazione.
-javax.portlet.title.1_WAR_marketplaceportlet=Store
-javax.portlet.title.2_WAR_marketplaceportlet=Acquistate
-javax.portlet.title.3_WAR_marketplaceportlet=Gestore delle App
-reindex-search=Reindicizza Ricerca
-there-are-no-configurable-plugins-for-this-app=Questa app non contiene plugin configurabili.
-this-app-contains=Questa app contiene:
-this-portlet-is-available-in-my-account=Questa portlet è disponibile nel Mio Account.
-this-portlet-is-available-in-site-administration=Questa portlet è disponibile in Amministrazione Sito.
-this-portlet-is-available-in-the-control-panel=Questa portlet è disponibile nel Pannello di Controllo.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Impossibile disinstallare questa app o plugin perché è obbligatorio.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_iw.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_iw.properties
deleted file mode 100644
index e9de929..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_iw.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=כל האפליקציות
-app-manager=אפליקצית ניהול
-are-you-sure-you-want-to-uninstall-this=?האם אתה בטוח שאתה מעונין להסיר את ההתקנה
-are-you-sure-you-want-to-uninstall-this-product=? האם אתה בטוח שאתה מעונין להסיר את המוצר
-could-not-connect-to-the-liferay-marketplace=Liferay לא מחובר לחנות
-file-upload-lpkg-or-war-file=(LPKG or WAR ) העלה מסמך חדש
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=אפליקציות שהותקנו טובות לכל מופעי הפורטל. לך לתצורת תוספים בכל מופע פורטל על מנת לאפשר/ לא לאפשר כל אפליקציה
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=אפליקצית ניהול
-reindex-search=לסדר מחדש חיפושים
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=האפליקציה הזו כוללת
-this-portlet-is-available-in-my-account=הפורטלט נמצאת בחשבון שלך
-this-portlet-is-available-in-site-administration=הפורטלט נמצאת בניהול האתר
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ja.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ja.properties
deleted file mode 100644
index dc53ccc..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ja.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=全アプリ
-app-manager=アプリケーションマネージャ
-are-you-sure-you-want-to-uninstall-this=これをアンインストールしてもよいですか？
-are-you-sure-you-want-to-uninstall-this-product=このプロダクトをアンインストールしますか？
-could-not-connect-to-the-liferay-marketplace=ライフレイマーケットプレイスに接続できません。
-file-upload-lpkg-or-war-file=ファイルアップロード(LPKGかWARファイル)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=インストールされたアプリは全ポータルインスタンスで使用可能です。それぞれのポータルインスタンスのプラグイン設定に行き、アプリの有効/無効を設定してください
-javax.portlet.title.1_WAR_marketplaceportlet=マーケットプレイス
-javax.portlet.title.2_WAR_marketplaceportlet=購入済み
-javax.portlet.title.3_WAR_marketplaceportlet=アプリケーションマネージャ
-reindex-search=サーチの再インデックス
-there-are-no-configurable-plugins-for-this-app=このアプリケーション用の設定可能なプラグインがありません
-this-app-contains=このアプリケーションは以下を含みます :
-this-portlet-is-available-in-my-account=ポートレットは自アカウントで使用可能です
-this-portlet-is-available-in-site-administration=このポートレットはサイト管理者が使用可能です
-this-portlet-is-available-in-the-control-panel=このポートレットはコントロールパネルで表示されます
-unable-to-uninstall-app-or-plugin-because-it-is-required=使用中のため、プラグイン/アプリケーションをアンインストールできません。
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ko.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ko.properties
deleted file mode 100644
index 97e7a76..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ko.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=모든 애플 리 케이 션 (Automatic Translation)
-app-manager=응용 프로그램 관리자 (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=당신은 이것을 제거 하 시겠습니까? (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=당신은 확실한가 당신 이 제품을 설치를 해제하고 싶은가? (Automatic Translation)
-could-not-connect-to-the-liferay-marketplace=Liferay 시장에 연결할 수 없었다. (Automatic Translation)
-file-upload-lpkg-or-war-file=파일 업로드 (LPKG 또는 WAR 파일) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=설치 된 애플 리 케이 션 모든 포털 인스턴스에 사용할 수 있습니다. 각 포털 인스턴스를 활성화/비활성화 각 애플 리 케이 션 내에서 플러그인 구성으로 이동 합니다. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=저장소 (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=구입 (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=응용 프로그램 관리자 (Automatic Translation)
-reindex-search=다시 검색 (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=이 애플 리 케이이 션에 대 한 없는 구성 가능한 플러그인이 있습니다. (Automatic Translation)
-this-app-contains=이 응용 프로그램에 포함 되어 있습니다. (Automatic Translation)
-this-portlet-is-available-in-my-account=이 포틀릿 내 계정에서 이용하실 수 있습니다. (Automatic Translation)
-this-portlet-is-available-in-site-administration=이 포틀릿에 사이트 관리에 사용할 수 있는입니다. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=이 포틀릿에 컨트롤 패널에서 사용할 수 있는입니다. (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=필요 하기 때문에 응용 프로그램 또는 플러그인을 제거할 수 없습니다. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_lo.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_lo.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_lo.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_lt.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_lt.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_lt.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nb.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nb.properties
deleted file mode 100644
index 5e2b113..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nb.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle applikasjoner
-app-manager=Applikasjonsforvaltning
-are-you-sure-you-want-to-uninstall-this=Er du sikker på at du ønsker å avinstallere dette?
-are-you-sure-you-want-to-uninstall-this-product=Er du sikker på at du ønsker å avinstallere dette produktet?
-could-not-connect-to-the-liferay-marketplace=Kunne ikke koble til Liferay Markedsplass.
-file-upload-lpkg-or-war-file=Filopplasting (LPKG- eller WAR-fil)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installerte applikasjoner gjøres tilgjengelig for alle portalinstanser. Gå til plugin-konfigurasjon i hver enkelt portalinstans for å aktivere/deaktivere hver enkelt applikasjon.
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Applikasjonsforvaltning
-reindex-search=Reindekser søk
-there-are-no-configurable-plugins-for-this-app=Det finnes ingen konfigurerbare plugins for denne applikasjonen.
-this-app-contains=Denne applikasjonen inneholder:
-this-portlet-is-available-in-my-account=Denne portleten er tilgjengelig under min konto.
-this-portlet-is-available-in-site-administration=Denne portleten er tilgjengelig under nettstedsadministrasjon.
-this-portlet-is-available-in-the-control-panel=Denne portleten er tilgjengelig i kontrollpanelet.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Applikasjonen eller plugin kan ikke avinstalleres fordi den er påkrevd.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nl.properties
deleted file mode 100644
index 7463506..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle apps
-app-manager=App manager
-are-you-sure-you-want-to-uninstall-this=Weet u zeker dat u dit wilt deïnstalleren?
-are-you-sure-you-want-to-uninstall-this-product=Weet u zeker dat u dit product wilt deïnstalleren?
-could-not-connect-to-the-liferay-marketplace=Er kon geen verbinding worden gemaakt met Liferay Marketplace.
-file-upload-lpkg-or-war-file=Bestand uploaden (LPKG- of WAR-bestand)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Geïnstalleerde apps zijn beschikbaar voor alle portalinstanties. Ga naar 'Toepassingen configureren' om deze per portalinstantie uit te schakelen.
-javax.portlet.title.1_WAR_marketplaceportlet=Winkel (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Gekocht (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=App manager
-reindex-search=Zoeken herindexeren
-there-are-no-configurable-plugins-for-this-app=Er zijn geen configureerbare plug-ins voor deze app.
-this-app-contains=Deze app bevat:
-this-portlet-is-available-in-my-account=Deze portlet is beschikbaar in Mijn account.
-this-portlet-is-available-in-site-administration=Deze portlet is beschikbaar in Sitebeheer.
-this-portlet-is-available-in-the-control-panel=Deze portlet is beschikbaar in het Controlepaneel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=De app of plug-in kan niet worden gedeïnstalleerd omdat deze plug-in benodigd is.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nl_BE.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nl_BE.properties
deleted file mode 100644
index 9e94a22..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_nl_BE.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Alle Apps (Automatic Translation)
-app-manager=App Manager (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=Weet u zeker dat u wilt verwijderen van dit? (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this-product=Zeker bent u u wilt desinstallatie dit product? (Automatic Translation)
-could-not-connect-to-the-liferay-marketplace=Kon niet met de Markt verbinden Liferay. (Automatic Translation)
-file-upload-lpkg-or-war-file=Bestand uploaden (LPKG of WAR-bestand) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Geïnstalleerde apps zijn beschikbaar voor alle portal exemplaren. Ga naar Plugins configuratie binnen elk portaal exemplaar te activeren/deactiveren elke app. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=Winkel (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Gekocht (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Translation)
-reindex-search=Zoek opnieuw indexeren (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=Er zijn geen configureerbare plugins voor dit app. (Automatic Translation)
-this-app-contains=Dit app bevat: (Automatic Translation)
-this-portlet-is-available-in-my-account=Dit portlet is beschikbaar in MijnAccount. (Automatic Translation)
-this-portlet-is-available-in-site-administration=Dit portlet is beschikbaar in Sitebeheer. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Onvermogend voor uninstall app of plugin, omdat het vereist is. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pl.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pt_BR.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pt_BR.properties
deleted file mode 100644
index 8b6cb69..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pt_BR.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Todos os aplicativos
-app-manager=Gerenciador de aplicativos
-are-you-sure-you-want-to-uninstall-this=Tem certeza de que deseja desinstalar este produto?
-are-you-sure-you-want-to-uninstall-this-product=Tem certeza de que deseja desinstalar este produto?
-could-not-connect-to-the-liferay-marketplace=Não foi possível conectar ao Liferay Marketplace.
-file-upload-lpkg-or-war-file=Upload de arquivo (LPKG ou WAR File)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Aplicativos instalados estão disponíveis para todas as instâncias do portal. Vá nas Configurações dos Plugins dentro de cada instância portal para ativar/desativar cada aplicativo.
-javax.portlet.title.1_WAR_marketplaceportlet=Loja (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Comprado (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=Gerenciador de aplicativos
-reindex-search=Reindexar busca
-there-are-no-configurable-plugins-for-this-app=Não há plugins configuráveis para este App.
-this-app-contains=Este App contém:
-this-portlet-is-available-in-my-account=Este portlet esta disponível em Minha Conta.
-this-portlet-is-available-in-site-administration=Este portlet esta disponível em Administração do Site.
-this-portlet-is-available-in-the-control-panel=Este portlet esta disponível no Painel de Controle.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Não foi possível desinstalar o app ou plugin pois ele é requerido.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pt_PT.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pt_PT.properties
deleted file mode 100644
index 1f2d5eb..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_pt_PT.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Todos os Apps (Automatic Translation)
-app-manager=App Manager (Automatic Translation)
-are-you-sure-you-want-to-uninstall-this=Confirma que deseja desinstalar este produto?
-are-you-sure-you-want-to-uninstall-this-product=Confirma que deseja desinstalar este produto?
-could-not-connect-to-the-liferay-marketplace=Não foi possível estabelecer conexão com o Marketplace da Liferay.
-file-upload-lpkg-or-war-file=Upload de arquivo (LPKG ou arquivo WAR) (Automatic Translation)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Apps instalados estão disponíveis para todas as instâncias de portal. Vá para configuração de Plugins dentro de cada instância portal para ativar/desativar cada app. (Automatic Translation)
-javax.portlet.title.1_WAR_marketplaceportlet=Loja (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=Comprado (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Translation)
-reindex-search=Reindexar pesquisa (Automatic Translation)
-there-are-no-configurable-plugins-for-this-app=Existem plugins configurável para este app. (Automatic Translation)
-this-app-contains=Este aplicativo contém: (Automatic Translation)
-this-portlet-is-available-in-my-account=Este portlet está disponível em minha conta. (Automatic Translation)
-this-portlet-is-available-in-site-administration=Este portlet está disponível no Site de administração. (Automatic Translation)
-this-portlet-is-available-in-the-control-panel=Este portlet está disponível no painel de controle. (Automatic Translation)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Não é possível desinstalar o app ou plugin porque é necessário. (Automatic Translation)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ro.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ro.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ro.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ru.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ru.properties
deleted file mode 100644
index c711953..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_ru.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Все приложения
-app-manager=Менеджер Приложений
-are-you-sure-you-want-to-uninstall-this=Вы действительно хотите удалить это?
-are-you-sure-you-want-to-uninstall-this-product=Вы действительно хотите удалить это приложение?
-could-not-connect-to-the-liferay-marketplace=Невозможно подключиться к Liferay Marketplace.
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Менеджер Приложений
-reindex-search=Переиндексировать поиск
-there-are-no-configurable-plugins-for-this-app=Для этого приложения нет настраиваемых плагинов.
-this-app-contains=Это приложение содержит:
-this-portlet-is-available-in-my-account=Этот портлет доступен в Моем Профиле.
-this-portlet-is-available-in-site-administration=Этот портлет доступен в Администрировании сайтом.
-this-portlet-is-available-in-the-control-panel=Этот портлет доступен в Панели Управления.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sk.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sk.properties
deleted file mode 100644
index 0734215..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sk.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Všetky aplikácie
-app-manager=Správca aplikácii
-are-you-sure-you-want-to-uninstall-this=Ste si istý, že chcete toto odinštalovať?
-are-you-sure-you-want-to-uninstall-this-product=Ste si istý, že chcete odinštalovať tento produkt?
-could-not-connect-to-the-liferay-marketplace=Nepodarilo sa pripojiť do Liferay Marketplace.
-file-upload-lpkg-or-war-file=Nahranie súboru (súbor typu LPKG alebo WAR)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Nainštalované aplikácie sú dostupné pre všetky inštancie portálu. Choďte do Konfigurácie zásuvných modulov v každej inštancii portálu aby ste ich povolili alebo zakázali.
-javax.portlet.title.1_WAR_marketplaceportlet=Skladisko
-javax.portlet.title.2_WAR_marketplaceportlet=Objednané
-javax.portlet.title.3_WAR_marketplaceportlet=Správca aplikácii
-reindex-search=Preindexovať vyhľadávanie
-there-are-no-configurable-plugins-for-this-app=Pre túto aplikáciu nie sú žiadne konfigurovateľné zásuvné moduly.
-this-app-contains=Táto aplikácia obsahuje:
-this-portlet-is-available-in-my-account=Tento portlet je dostupný v Mojom účte.
-this-portlet-is-available-in-site-administration=Tento portlet dostupný v Správe sídla.
-this-portlet-is-available-in-the-control-panel=Tento portlet je dostupný cez ovládací panel.
-unable-to-uninstall-app-or-plugin-because-it-is-required=Nemôžem odinštalovať aplikáciu alebo zásuvný modul, lebo je požadovaný.
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sl.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sl.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sl.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sr_RS.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sr_RS.properties
deleted file mode 100644
index ce498ed..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sr_RS.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=Све апликације
-app-manager=Управљање апликацијама
-are-you-sure-you-want-to-uninstall-this=Да ли сте сигурни да желите да деинсталирате ово?
-are-you-sure-you-want-to-uninstall-this-product=Да ли сте сигурни да желите да деинсталирате ова производ?
-could-not-connect-to-the-liferay-marketplace=Не могу се конектовати на Liferay Marketplace?
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=Управљање апликацијама
-reindex-search=Реиндекс Претрага
-there-are-no-configurable-plugins-for-this-app=Нема конфигурабилних додатака за ову апликацију.
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sr_RS_latin.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sr_RS_latin.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sr_RS_latin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sv.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sv.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_sv.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_tr.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_tr.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_tr.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_uk.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_uk.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_uk.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_vi.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_vi.properties
deleted file mode 100644
index fc839e1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_vi.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=All Apps (Automatic Copy)
-app-manager=App Manager (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this=Are you sure you want to uninstall this? (Automatic Copy)
-are-you-sure-you-want-to-uninstall-this-product=Are you sure you want to uninstall this product? (Automatic Copy)
-could-not-connect-to-the-liferay-marketplace=Could not connect to the Liferay Marketplace. (Automatic Copy)
-file-upload-lpkg-or-war-file=File Upload (LPKG or WAR File) (Automatic Copy)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=Installed apps are available to all portal instances. Go to Plugins Configuration within each portal instance to enable/disable each app. (Automatic Copy)
-javax.portlet.title.1_WAR_marketplaceportlet=Store (Automatic Copy)
-javax.portlet.title.2_WAR_marketplaceportlet=Purchased (Automatic Copy)
-javax.portlet.title.3_WAR_marketplaceportlet=App Manager (Automatic Copy)
-reindex-search=Reindex Search (Automatic Copy)
-there-are-no-configurable-plugins-for-this-app=There are no configurable plugins for this app. (Automatic Copy)
-this-app-contains=This app contains: (Automatic Copy)
-this-portlet-is-available-in-my-account=This portlet is available in My Account. (Automatic Copy)
-this-portlet-is-available-in-site-administration=This portlet is available in Site Administration. (Automatic Copy)
-this-portlet-is-available-in-the-control-panel=This portlet is available in the Control Panel. (Automatic Copy)
-unable-to-uninstall-app-or-plugin-because-it-is-required=Unable to uninstall app or plugin because it is required. (Automatic Copy)
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_zh_CN.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_zh_CN.properties
deleted file mode 100644
index c783e81..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_zh_CN.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=所有应用
-app-manager=应用程序管理器
-are-you-sure-you-want-to-uninstall-this=您确定要卸载这一产品吗？
-are-you-sure-you-want-to-uninstall-this-product=您确定要卸载这一产品吗？
-could-not-connect-to-the-liferay-marketplace=不能连接至Liferay Marketplace。
-file-upload-lpkg-or-war-file=文件上传（LPKG或WAR文件）
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=已安装的应用程序可供所有portal实例使用。可以在每个portal实例的Plugin设置里使用/停用应用程序。
-javax.portlet.title.1_WAR_marketplaceportlet=商店
-javax.portlet.title.2_WAR_marketplaceportlet=已购买
-javax.portlet.title.3_WAR_marketplaceportlet=应用程序管理器
-reindex-search=重建索引搜索
-there-are-no-configurable-plugins-for-this-app=这一应用没有可配置的plugin。
-this-app-contains=这一应用包含：
-this-portlet-is-available-in-my-account=这一portlet在我的账户中可用。
-this-portlet-is-available-in-site-administration=这一portlet在站点管理中可用。
-this-portlet-is-available-in-the-control-panel=这一portlet在控制面板中可用。
-unable-to-uninstall-app-or-plugin-because-it-is-required=无法卸载软件或plugin，因为它是必需的。
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_zh_TW.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_zh_TW.properties
deleted file mode 100644
index 65e4ece..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/content/Language_zh_TW.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-all-apps=所有應用程式
-app-manager=應用程式管理員
-are-you-sure-you-want-to-uninstall-this=您確定想要移除這個？
-are-you-sure-you-want-to-uninstall-this-product=您確定想要移除這產品？
-could-not-connect-to-the-liferay-marketplace=連結不到Liferay市集。
-file-upload-lpkg-or-war-file=檔案上傳(LPKG 或 WAR 檔)
-installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app=安裝的應用程式可提供給所有入口網實體。到每個入口網實體的插件設定以啟用/停用每個應用程式。
-javax.portlet.title.1_WAR_marketplaceportlet=存儲區 (Automatic Translation)
-javax.portlet.title.2_WAR_marketplaceportlet=購買 (Automatic Translation)
-javax.portlet.title.3_WAR_marketplaceportlet=應用程式管理員
-reindex-search=重新索引搜尋
-there-are-no-configurable-plugins-for-this-app=沒有為這應用程式設定插件。
-this-app-contains=這應用程式包含：
-this-portlet-is-available-in-my-account=這Portlet在您帳戶是可用的。
-this-portlet-is-available-in-site-administration=這Portlet在站台系統管理員是可用的。
-this-portlet-is-available-in-the-control-panel=這Portlet在控制面板是可用的。
-unable-to-uninstall-app-or-plugin-because-it-is-required=無法移除應用程式或插件因為它是必需的。
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/portal.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/portal.properties
deleted file mode 100644
index 1c82001..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/portal.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-release.info.build.number=100
-release.info.previous.build.number=0
-
-upgrade.processes=\
-    com.liferay.marketplace.hook.upgrade.UpgradeProcess_1_0_0
-
-application.startup.events=com.liferay.marketplace.hook.events.StartupAction
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/service.properties b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/service.properties
deleted file mode 100644
index 909dd5b..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/src/service.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-##
-## Properties Override
-##
-
-    #
-    # Specify where to get the overridden properties. Updates should not be made
-    # on this file but on the overridden version of this file.
-    #
-    include-and-override=${base.path}/service-ext.properties
-
-##
-## Build
-##
-
-    build.namespace=Marketplace
-    build.number=3
-    build.date=1371580382539
-    build.auto.upgrade=true
-
-##
-## Spring
-##
-
-    #
-    # Input a list of comma delimited Spring configurations. These will be
-    # loaded after the bean definitions specified in the
-    # portalContextConfigLocation parameter in web.xml.
-    #
-    spring.configs=\
-        WEB-INF/classes/META-INF/base-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/hibernate-spring.xml,\
-        WEB-INF/classes/META-INF/infrastructure-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/cluster-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/portlet-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/shard-data-source-spring.xml,\
-        \
-        WEB-INF/classes/META-INF/ext-spring.xml
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/aui.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/aui.tld
deleted file mode 100644
index 0e076ab..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/aui.tld
+++ /dev/null
@@ -1,2336 +0,0 @@
-<?xml version="1.0"?>
-
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
-	<tlib-version>1.0</tlib-version>
-	<short-name>aui</short-name>
-	<uri>http://alloy.liferay.com/tld/aui</uri>
-	<tag>
-		<name>button-item</name>
-		<tag-class>com.liferay.taglib.aui.ButtonItemTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description><![CDATA[Whether to track the active state of the button.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"false"}-->]]></description>
-			<name>activeState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[The outermost DOM node for the Widget, used for sizing and positioning
-	of a Widget as well as a containing element for any decorator elements used
-	for skinning.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>boundingBox</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[An object map of the CSS class names to use for the different interaction states.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.util.HashMap","required":false}-->]]></description>
-			<name>classNames</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[A DOM node that is a direct descendant of a Widget's bounding box that
-	houses its content.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>contentBox</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[CSS class to be automatically added to the <code>boundingBox</code>.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Whether to apply the default interaction state to the button<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"true"}-->]]></description>
-			<name>defaultState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Number representing the depth of this Widget relative to
-	the root Widget in the object heirarchy.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Number","required":false,"defaultValue":"-1"}-->]]></description>
-			<name>depth</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Flag indicating whether or not this object
-	has been through the destroy lifecycle phase.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"false"}-->]]></description>
-			<name>destroyed</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Boolean indicating if the Widget should be disabled. The disabled implementation
-	is left to the specific classes extending widget.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"false"}-->]]></description>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Boolean indicating if the Widget, or one of its descendants,
-	has focus.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"false"}-->]]></description>
-			<name>focused</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[An event callback to handle when a user interacts with the button.
-	This can either be a function that will be attached on click, or
-	an object map that accepts the following keys:
-	<code>{fn: // The function to execute
-	context: // The context to execute the function in
-	type: // The type of event to listen for (defaults to "click")
-	}</code><!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false,"defaultValue":"false"}-->]]></description>
-			<name>handler</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[String with units, or number, representing the height of the Widget. If a number is provided,
-	the default unit, defined by the Widgets DEF_UNIT, property is used.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>height</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[css class added to hide the <code>boundingBox</code> when
-	<a href="Component.html#config_visible">visible</a> is set to
-	<code>false</code>.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false,"defaultValue":"aui-hide"}-->]]></description>
-			<name>hideClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Whether to track the hover interaction state of the button.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"true"}-->]]></description>
-			<name>hoverState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[The icon to use inside of the button. Possible values are:<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>icon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[DOM Node to display the icon of the ButtonItem. If not
-	specified try to query using HTML_PARSER an element inside
-	boundingBox which matches <code>aui-button-icon</code>.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>iconNode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>buttonitemId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Number representing the Widget's ordinal position in its
-	parent Widget.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Number","required":false,"defaultValue":"0"}-->]]></description>
-			<name>index</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Flag indicating whether or not this object
-	has been through the init lifecycle phase.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"false"}-->]]></description>
-			<name>initialized</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Text to use inside of the button.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[DOM Node to display the text of the ButtonItem. If not
-	specified try to query using HTML_PARSER an element inside
-	boundingBox which matches <code>aui-button-label</code>.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>labelNode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Retrieves the parent of the Widget in the object hierarchy.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>buttonitemParent</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[If <code>true</code> the render phase will be autimatically invoked
-	preventing the <code>.render()</code> manual call.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false,"defaultValue":"false"}-->]]></description>
-			<name>render</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Flag indicating whether or not this Widget
-	has been through the render lifecycle phase.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"false"}-->]]></description>
-			<name>rendered</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Returns the root Widget in the object hierarchy.  If the
-	ROOT_TYPE property is set, the search for the root Widget will be
-	constrained to parent Widgets of the specified type.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>root</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Number indicating if the Widget is selected.  Possible
-	values are:
-	<dl>
-	<dt>0</dt> <dd>(Default) Not selected</dd>
-	<dt>1</dt> <dd>Fully selected</dd>
-	<dt>2</dt> <dd>Partially selected</dd>
-	</dl><!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Number","required":false,"defaultValue":"0"}-->]]></description>
-			<name>selected</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[The DOM node to parse for configuration values, passed to the Widget's HTML_PARSER definition<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>srcNode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Collection of strings used to label elements of the Widget's UI.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.util.HashMap","required":false}-->]]></description>
-			<name>strings</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Number (between -32767 to 32767) indicating the widget's
-	position in the default tab flow.  The value is used to set the
-	"tabIndex" attribute on the widget's bounding box.  Negative values allow
-	the widget to receive DOM focus programmatically (by calling the focus
-	method), while being removed from the default tab flow.  A value of
-	null removes the "tabIndex" attribute from the widget's bounding box.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Number","required":false,"defaultValue":"0"}-->]]></description>
-			<name>tabIndex</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Text to use as the title attribute of the button.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false}-->]]></description>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Button type.<!--{"event":false,"inputType":"java.lang.String","outputType":"java.lang.String","required":false,"defaultValue":"button"}-->]]></description>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Boolean indicating if use of the WAI-ARIA Roles and States should be
-	enabled for the Widget.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"true"}-->]]></description>
-			<name>useARIA</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Boolean indicating weather or not the Widget is visible.<!--{"event":false,"inputType":"boolean","outputType":"boolean","required":false,"defaultValue":"true"}-->]]></description>
-			<name>visible</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[String with units, or number, representing the width of the Widget. If a number is provided,
-	the default unit, defined by the Widgets DEF_UNIT, property is used.<!--{"event":false,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>width</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'activeState' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterActiveStateChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'boundingBox' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterBoundingBoxChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'classNames' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterClassNamesChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'contentBox' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterContentBoxChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'cssClass' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterCssClassChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'defaultState' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterDefaultStateChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'depth' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterDepthChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[<p>
-	Lifecycle event for the destroy phase,
-	fired prior to destruction. Invoking the preventDefault
-	method on the event object provided to subscribers will
-	prevent destruction from proceeding.
-	</p>
-	<p>
-	Subscribers to the "after" moment of this event, will be notified
-	after destruction is complete (and as a result cannot prevent
-	destruction).
-	</p><!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterDestroy</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'destroyed' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterDestroyedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'disabled' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterDisabledChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'focused' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterFocusedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'handler' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterHandlerChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'height' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterHeightChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'hideClass' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterHideClassChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'hoverState' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterHoverStateChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'icon' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterIconChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'iconNode' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterIconNodeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'id' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterIdChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'index' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterIndexChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[<p>
-	Lifecycle event for the init phase, fired prior to initialization.
-	Invoking the preventDefault() method on the event object provided
-	to subscribers will prevent initialization from occuring.
-	</p>
-	<p>
-	Subscribers to the "after" momemt of this event, will be notified
-	after initialization of the object is complete (and therefore
-	cannot prevent initialization).
-	</p><!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterInit</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'initialized' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterInitializedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'label' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterLabelChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'labelNode' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterLabelNodeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'parent' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterParentChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'render' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterRenderChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'rendered' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterRenderedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'root' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterRootChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'selected' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterSelectedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'srcNode' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterSrcNodeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'strings' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterStringsChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'tabIndex' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterTabIndexChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'title' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterTitleChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'type' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterTypeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'useARIA' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterUseARIAChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'visible' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterVisibleChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Notification event, which widget implementations can fire, when
-	they change the content of the widget. This event has no default
-	behavior and cannot be prevented, so the "on" or "after"
-	moments are effectively equivalent (with on listeners being invoked before
-	after listeners).<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterContentUpdate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Lifecycle event for the render phase, fired prior to rendering the UI
-	for the widget (prior to invoking the widget's renderer method).
-	<p>
-	Subscribers to the "on" moment of this event, will be notified
-	before the widget is rendered.
-	</p>
-	<p>
-	Subscribers to the "after" moment of this event, will be notified
-	after rendering is complete.
-	</p><!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterRender</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'width' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>afterWidthChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'activeState' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onActiveStateChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'boundingBox' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onBoundingBoxChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'classNames' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onClassNamesChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'contentBox' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onContentBoxChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'cssClass' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onCssClassChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'defaultState' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onDefaultStateChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'depth' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onDepthChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[<p>
-	Lifecycle event for the destroy phase,
-	fired prior to destruction. Invoking the preventDefault
-	method on the event object provided to subscribers will
-	prevent destruction from proceeding.
-	</p>
-	<p>
-	Subscribers to the "after" moment of this event, will be notified
-	after destruction is complete (and as a result cannot prevent
-	destruction).
-	</p><!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onDestroy</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'destroyed' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onDestroyedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'disabled' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onDisabledChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'focused' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onFocusedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'handler' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onHandlerChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'height' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onHeightChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'hideClass' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onHideClassChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'hoverState' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onHoverStateChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'icon' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onIconChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'iconNode' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onIconNodeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'id' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onIdChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'index' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onIndexChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[<p>
-	Lifecycle event for the init phase, fired prior to initialization.
-	Invoking the preventDefault() method on the event object provided
-	to subscribers will prevent initialization from occuring.
-	</p>
-	<p>
-	Subscribers to the "after" momemt of this event, will be notified
-	after initialization of the object is complete (and therefore
-	cannot prevent initialization).
-	</p><!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onInit</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'initialized' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onInitializedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'label' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onLabelChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'labelNode' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onLabelNodeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'parent' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onParentChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'render' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onRenderChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'rendered' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onRenderedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'root' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onRootChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'selected' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onSelectedChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'srcNode' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onSrcNodeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'strings' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onStringsChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'tabIndex' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onTabIndexChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'title' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onTitleChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'type' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onTypeChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'useARIA' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onUseARIAChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'visible' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onVisibleChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Notification event, which widget implementations can fire, when
-	they change the content of the widget. This event has no default
-	behavior and cannot be prevented, so the "on" or "after"
-	moments are effectively equivalent (with on listeners being invoked before
-	after listeners).<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onContentUpdate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Lifecycle event for the render phase, fired prior to rendering the UI
-	for the widget (prior to invoking the widget's renderer method).
-	<p>
-	Subscribers to the "on" moment of this event, will be notified
-	before the widget is rendered.
-	</p>
-	<p>
-	Subscribers to the "after" moment of this event, will be notified
-	after rendering is complete.
-	</p><!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onRender</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<description><![CDATA[Fires when the value for the configuration attribute 'width' is changed. You can listen for the event using the <a href="Attribute.html#method_on">on</a> method if you wish to be notified before the attribute's value has changed, or using the <a href="Event.Target.html#method_after">after</a> method if you wish to be notified after the attribute's value has changed.<!--{"event":true,"inputType":"java.lang.Object","outputType":"java.lang.Object","required":false}-->]]></description>
-			<name>onWidthChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>a</name>
-		<tag-class>com.liferay.taglib.aui.ATag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>ariaRole</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.util.Map</type>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>lang</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>button</name>
-		<tag-class>com.liferay.taglib.aui.ButtonTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>icon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>iconAlign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>primary</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>useDialog</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>button-row</name>
-		<tag-class>com.liferay.taglib.aui.ButtonRowTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>col</name>
-		<tag-class>com.liferay.taglib.aui.ColTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>offset</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>int</type>
-		</attribute>
-		<attribute>
-			<name>offsetWidth</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>int</type>
-		</attribute>
-		<attribute>
-			<name>span</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>int</type>
-		</attribute>
-		<attribute>
-			<name>width</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>int</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>column</name>
-		<tag-class>com.liferay.taglib.aui.ColumnTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>columnWidth</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>int</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>first</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>last</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>component</name>
-		<tag-class>com.liferay.taglib.aui.ComponentTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>defineVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>excludeAttributes</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>javaScriptAttributes</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>module</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>options</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.util.Map</type>
-		</attribute>
-		<attribute>
-			<name>scriptPosition</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>tagPageContext</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>javax.servlet.jsp.JspContext</type>
-		</attribute>
-		<attribute>
-			<name>useJavaScript</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.io.Serializable</type>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>container</name>
-		<tag-class>com.liferay.taglib.aui.ContainerTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>fluid</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>field-wrapper</name>
-		<tag-class>com.liferay.taglib.aui.FieldWrapperTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>first</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>helpMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>inlineField</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>inlineLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>last</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>required</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-	</tag>
-	<tag>
-		<name>fieldset</name>
-		<tag-class>com.liferay.taglib.aui.FieldsetTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>column</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>helpMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>form</name>
-		<tag-class>com.liferay.taglib.aui.FormTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>action</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>escapeXml</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>inlineLabels</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>method</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onSubmit</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>portletNamespace</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>useNamespace</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>icon</name>
-		<tag-class>com.liferay.taglib.aui.IconTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.util.Map</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>image</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>input</name>
-		<tag-class>com.liferay.taglib.aui.InputTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>autoSize</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>bean</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>changesContext</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>checked</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>long</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>dateTogglerCheckboxLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>defaultLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>field</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>fieldParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>first</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>helpMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>helpTextCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>ignoreRequestValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>inlineField</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>inlineLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>languageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>last</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>max</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>model</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Class</type>
-		</attribute>
-		<attribute>
-			<name>min</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>multiple</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>placeholder</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>prefix</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>required</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>resizable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>showRequiredLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>suffix</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>useNamespace</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>wrapperCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>layout</name>
-		<tag-class>com.liferay.taglib.aui.LayoutTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>model-context</name>
-		<tag-class>com.liferay.taglib.aui.ModelContextTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bean</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>defaultLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>model</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Class</type>
-		</attribute>
-	</tag>
-	<tag>
-		<name>nav</name>
-		<tag-class>com.liferay.taglib.aui.NavTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>ariaLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>ariaRole</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>collapsible</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>icon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>useNamespace</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>nav-bar</name>
-		<tag-class>com.liferay.taglib.aui.NavBarTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>nav-bar-search</name>
-		<tag-class>com.liferay.taglib.aui.NavBarSearchTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>file</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>searchContainer</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>com.liferay.portal.kernel.dao.search.SearchContainer</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>nav-item</name>
-		<tag-class>com.liferay.taglib.aui.NavItemTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>anchorCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>anchorData</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>anchorId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>ariaLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>ariaRole</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>dropdown</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>iconCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>selected</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>state</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>toggle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>useDialog</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>wrapDropDownMenu</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>option</name>
-		<tag-class>com.liferay.taglib.aui.OptionTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.util.Map</type>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>selected</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>style</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>useModelValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>panel</name>
-		<tag-class>com.liferay.taglib.aui.PanelTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>collapsed</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>collapsible</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-	</tag>
-	<tag>
-		<name>row</name>
-		<tag-class>com.liferay.taglib.aui.RowTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>fluid</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>script</name>
-		<tag-class>com.liferay.taglib.aui.ScriptTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>position</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>use</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-	</tag>
-	<tag>
-		<name>select</name>
-		<tag-class>com.liferay.taglib.aui.SelectTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bean</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>changesContext</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.util.Map</type>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>first</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>helpMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>ignoreRequestValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>inlineField</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>inlineLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>last</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>listType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>listTypeFieldName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>multiple</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>prefix</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>required</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>showEmptyOption</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>showRequiredLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>suffix</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>useNamespace</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>spacer</name>
-		<tag-class>com.liferay.taglib.aui.SpacerTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>translation-manager</name>
-		<tag-class>com.liferay.taglib.aui.TranslationManagerTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>availableLocales</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.util.Locale[]</type>
-		</attribute>
-		<attribute>
-			<name>defaultLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>editingLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>initialize</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>readOnly</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-	</tag>
-	<tag>
-		<name>validator</name>
-		<tag-class>com.liferay.taglib.aui.ValidatorTagImpl</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>errorMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-	</tag>
-	<tag>
-		<name>workflow-status</name>
-		<tag-class>com.liferay.taglib.aui.WorkflowStatusTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bean</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-		<attribute>
-			<name>helpMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>model</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Class</type>
-		</attribute>
-		<attribute>
-			<name>showIcon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>showLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>boolean</type>
-		</attribute>
-		<attribute>
-			<name>status</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Integer</type>
-		</attribute>
-		<attribute>
-			<name>statusMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-		<attribute>
-			<name>version</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.String</type>
-		</attribute>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/c.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/c.tld
deleted file mode 100644
index 98efa6a..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/c.tld
+++ /dev/null
@@ -1,572 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<taglib 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-jsptaglibrary_2_1.xsd"
-    version="2.1">
-    
-  <description>JSTL 1.2 core library</description>
-  <display-name>JSTL core</display-name>
-  <tlib-version>1.2</tlib-version>
-  <short-name>c</short-name>
-  <uri>http://java.sun.com/jsp/jstl/core</uri>
-
-  <validator>
-    <description>
-        Provides core validation features for JSTL tags.
-    </description>
-    <validator-class>
-        org.apache.taglibs.standard.tlv.JstlCoreTLV
-    </validator-class>
-  </validator>
-
-  <tag>
-    <description>
-        Catches any Throwable that occurs in its body and optionally
-        exposes it.
-    </description>
-    <name>catch</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-exception thrown from a nested action. The type of the
-scoped variable is the type of the exception thrown.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Simple conditional tag that establishes a context for
-	mutually exclusive conditional operations, marked by
-	&lt;when&gt; and &lt;otherwise&gt;
-    </description>
-    <name>choose</name>
-    <tag-class>com.liferay.taglib.core.ChooseTag</tag-class>
-    <body-content>JSP</body-content>
-  </tag>
-
-  <tag>
-    <description>
-	Simple conditional tag, which evalutes its body if the
-	supplied condition is true and optionally exposes a Boolean
-	scripting variable representing the evaluation of this condition
-    </description>
-    <name>if</name>
-    <tag-class>com.liferay.taglib.core.IfTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The test condition that determines whether or
-not the body content should be processed.
-        </description>
-        <name>test</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-	<type>boolean</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resulting value of the test condition. The type
-of the scoped variable is Boolean.        
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Retrieves an absolute or relative URL and exposes its contents
-        to either the page, a String in 'var', or a Reader in 'varReader'.
-    </description>
-    <name>import</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ImportTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.ImportTEI</tei-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The URL of the resource to import.
-        </description>
-        <name>url</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resource's content. The type of the scoped
-variable is String.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-resource's content. The type of the scoped
-variable is Reader.
-        </description>
-        <name>varReader</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the context when accessing a relative
-URL resource that belongs to a foreign
-context.
-        </description>
-        <name>context</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Character encoding of the content at the input
-resource.
-        </description>
-        <name>charEncoding</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	The basic iteration tag, accepting many different
-        collection types and supporting subsetting and other
-        functionality
-    </description>
-    <name>forEach</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.ForEachTEI</tei-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Collection of items to iterate over.
-        </description>
-	<name>items</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>java.lang.Object</type>
-        <deferred-value>
-	    <type>java.lang.Object</type>
-        </deferred-value>
-    </attribute>
-    <attribute>
-        <description>
-If items specified:
-Iteration begins at the item located at the
-specified index. First item of the collection has
-index 0.
-If items not specified:
-Iteration begins with index set at the value
-specified.
-        </description>
-	<name>begin</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-If items specified:
-Iteration ends at the item located at the
-specified index (inclusive).
-If items not specified:
-Iteration ends when index reaches the value
-specified.
-        </description>
-	<name>end</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration will only process every step items of
-the collection, starting with the first one.
-        </description>
-	<name>step</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-current item of the iteration. This scoped
-variable has nested visibility. Its type depends
-on the object of the underlying collection.
-        </description>
-	<name>var</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-status of the iteration. Object exported is of type
-javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested
-visibility.
-        </description>
-	<name>varStatus</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Iterates over tokens, separated by the supplied delimeters
-    </description>
-    <name>forTokens</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForTokensTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-String of tokens to iterate over.
-        </description>
-	<name>items</name>
-	<required>true</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>java.lang.String</type>
-        <deferred-value>
-	    <type>java.lang.String</type>
-        </deferred-value>
-    </attribute>
-    <attribute>
-        <description>
-The set of delimiters (the characters that
-separate the tokens in the string).
-        </description>
-	<name>delims</name>
-	<required>true</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>java.lang.String</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration begins at the token located at the
-specified index. First token has index 0.
-        </description>
-	<name>begin</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration ends at the token located at the
-specified index (inclusive).
-        </description>
-	<name>end</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Iteration will only process every step tokens
-of the string, starting with the first one.
-        </description>
-	<name>step</name>
-	<required>false</required>
-	<rtexprvalue>true</rtexprvalue>
-	<type>int</type>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-current item of the iteration. This scoped
-variable has nested visibility.
-        </description>
-	<name>var</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-status of the iteration. Object exported is of
-type
-javax.servlet.jsp.jstl.core.LoopTag
-Status. This scoped variable has nested
-visibility.
-        </description>
-	<name>varStatus</name>
-	<required>false</required>
-	<rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Like &lt;%= ... &gt;, but for expressions.
-    </description> 
-    <name>out</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Expression to be evaluated.
-        </description>
-        <name>value</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Default value if the resulting value is null.
-        </description>
-        <name>default</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Determines whether characters &lt;,&gt;,&amp;,'," in the
-resulting string should be converted to their
-corresponding character entity codes. Default value is
-true.
-        </description>
-        <name>escapeXml</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-
-  <tag>
-    <description>
-        Subtag of &lt;choose&gt; that follows &lt;when&gt; tags
-        and runs only if all of the prior conditions evaluated to
-        'false'
-    </description>
-    <name>otherwise</name>
-    <tag-class>com.liferay.taglib.core.OtherwiseTag</tag-class>
-    <body-content>JSP</body-content>
-  </tag>
-
-  <tag>
-    <description>
-        Adds a parameter to a containing 'import' tag's URL.
-    </description>
-    <name>param</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.ParamTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the query string parameter.
-        </description>
-        <name>name</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Value of the parameter.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Redirects to a new URL.
-    </description>
-    <name>redirect</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.RedirectTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The URL of the resource to redirect to.
-        </description>
-        <name>url</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the context when redirecting to a relative URL
-resource that belongs to a foreign context.
-        </description>
-        <name>context</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Removes a scoped variable (from a particular scope, if specified).
-    </description>
-    <name>remove</name>
-    <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-        <description>
-Name of the scoped variable to be removed.
-        </description>
-        <name>var</name>
-        <required>true</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
- <tag>
-    <description>
-        Sets the result of an expression evaluation in a 'scope'
-    </description>
-    <name>set</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.SetTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable to hold the value
-specified in the action. The type of the scoped variable is
-whatever type the value expression evaluates to.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Expression to be evaluated.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-        <deferred-value>
-	    <type>java.lang.Object</type>
-        </deferred-value>
-    </attribute>
-    <attribute>
-        <description>
-Target object whose property will be set. Must evaluate to
-a JavaBeans object with setter property property, or to a
-java.util.Map object.
-        </description>
-        <name>target</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the property to be set in the target object.
-        </description>
-        <name>property</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-        Creates a URL with optional query parameters.
-    </description>
-    <name>url</name>
-    <tag-class>org.apache.taglibs.standard.tag.rt.core.UrlTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-Name of the exported scoped variable for the
-processed url. The type of the scoped variable is
-String.
-        </description>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Scope for var.
-        </description>
-        <name>scope</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-URL to be processed.
-        </description>
-        <name>value</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-        <description>
-Name of the context when specifying a relative URL
-resource that belongs to a foreign context.
-        </description>
-        <name>context</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>
-	Subtag of &lt;choose&gt; that includes its body if its
-	condition evalutes to 'true'
-    </description>
-    <name>when</name>
-    <tag-class>com.liferay.taglib.core.WhenTag</tag-class>
-    <body-content>JSP</body-content>
-    <attribute>
-        <description>
-The test condition that determines whether or not the
-body content should be processed.
-        </description>
-        <name>test</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-	<type>boolean</type>
-    </attribute>
-  </tag>
-
-</taglib>
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-portlet.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-portlet.tld
deleted file mode 100644
index a7cd2fd..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-portlet.tld
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-
-<taglib>
-	<tlib-version>1.0</tlib-version>
-	<jsp-version>1.1</jsp-version>
-	<short-name>portlet</short-name>
-	<uri>http://java.sun.com/portlet</uri>
-	<tag>
-		<name>actionURL</name>
-		<tag-class>com.liferay.taglib.portlet.ActionURLTag</tag-class>
-		<tei-class>com.liferay.taglib.portlet.ActionURLTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>copyCurrentRenderParameters</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>escapeXml</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletMode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>secure</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>windowState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>defineObjects</name>
-		<tag-class>com.liferay.taglib.portlet.DefineObjectsTag</tag-class>
-		<tei-class>com.liferay.taglib.portlet.DefineObjectsTei</tei-class>
-		<body-content>empty</body-content>
-	</tag>
-	<tag>
-		<name>namespace</name>
-		<tag-class>com.liferay.taglib.portlet.NamespaceTag</tag-class>
-		<body-content>empty</body-content>
-	</tag>
-	<tag>
-		<name>param</name>
-		<tag-class>com.liferay.taglib.util.ParamTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>property</name>
-		<tag-class>com.liferay.taglib.util.PropertyTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>renderURL</name>
-		<tag-class>com.liferay.taglib.portlet.RenderURLTag</tag-class>
-		<tei-class>com.liferay.taglib.portlet.RenderURLTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>copyCurrentRenderParameters</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>escapeXml</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletMode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>secure</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>windowState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>resourceURL</name>
-		<tag-class>com.liferay.taglib.portlet.ResourceURLTag</tag-class>
-		<tei-class>com.liferay.taglib.portlet.ResourceURLTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cacheability</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>escapeXml</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>secure</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-security.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-security.tld
deleted file mode 100644
index f8e6f6d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-security.tld
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-
-<taglib>
-	<tlib-version>1.0</tlib-version>
-	<jsp-version>1.1</jsp-version>
-	<short-name>liferay-security</short-name>
-	<uri>http://liferay.com/tld/security</uri>
-	<tag>
-		<name>doAsURL</name>
-		<tag-class>com.liferay.taglib.security.DoAsURLTag</tag-class>
-		<tei-class>com.liferay.taglib.security.DoAsURLTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>doAsUserId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>encrypt</name>
-		<tag-class>com.liferay.taglib.security.EncryptTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>protocol</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>style</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>unencryptedParams</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>permissionsURL</name>
-		<tag-class>com.liferay.taglib.security.PermissionsURLTag</tag-class>
-		<tei-class>com.liferay.taglib.security.PermissionsURLTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>modelResource</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>modelResourceDescription</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>redirect</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>resourceGroupId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>resourcePrimKey</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>roleTypes</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>windowState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-theme.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-theme.tld
deleted file mode 100644
index 90ac81d..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-theme.tld
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-
-<taglib>
-	<tlib-version>1.0</tlib-version>
-	<jsp-version>1.1</jsp-version>
-	<short-name>theme</short-name>
-	<uri>http://liferay.com/tld/theme</uri>
-	<tag>
-		<name>defineObjects</name>
-		<tag-class>com.liferay.taglib.theme.DefineObjectsTag</tag-class>
-		<tei-class>com.liferay.taglib.theme.DefineObjectsTei</tei-class>
-		<body-content>empty</body-content>
-	</tag>
-	<tag>
-		<name>include</name>
-		<tag-class>com.liferay.taglib.theme.IncludeTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>page</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>layout-icon</name>
-		<tag-class>com.liferay.taglib.theme.LayoutIconTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>layout</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>meta-tags</name>
-		<tag-class>com.liferay.taglib.theme.MetaTagsTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>param</name>
-		<tag-class>com.liferay.taglib.util.ParamTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>wrap-portlet</name>
-		<tag-class>com.liferay.taglib.theme.WrapPortletTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>page</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-ui.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-ui.tld
deleted file mode 100644
index 709dd7f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-ui.tld
+++ /dev/null
@@ -1,4107 +0,0 @@
-<?xml version="1.0"?>
-
-<taglib
-	version="2.0"
-	xmlns="http://java.sun.com/xml/ns/j2ee"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-	>
-	<tlib-version>1.0</tlib-version>
-	<short-name>liferay-ui</short-name>
-	<uri>http://liferay.com/tld/ui</uri>
-	<tag>
-		<name>app-view-display-style</name>
-		<tag-class>com.liferay.taglib.ui.AppViewDisplayStyleTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>displayStyle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyles</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>requestParams</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>app-view-entry</name>
-		<tag-class>com.liferay.taglib.ui.AppViewEntryTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>actionJsp</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>assetCategoryClassName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>assetCategoryClassPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>assetTagClassName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>assetTagClassPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>author</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>createDate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>description</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayDate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>expirationDate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>folder</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>groupId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>latestApprovedVersion</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>latestApprovedVersionAuthor</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>locked</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>modifiedDate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>reviewDate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowCheckerId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowCheckerName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>shortcut</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showCheckbox</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showLinkTitle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>status</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>thumbnailDivStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>thumbnailSrc</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>thumbnailStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>version</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>app-view-navigation-entry</name>
-		<tag-class>com.liferay.taglib.ui.AppViewNavigationEntryTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>actionJsp</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>dataView</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>entryTitle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>iconImage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>iconSrc</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>selected</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>viewURL</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>app-view-toolbar</name>
-		<tag-class>com.liferay.taglib.ui.AppViewToolbarTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>includeDisplayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>includeSelectAll</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchJsp</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>app-view-search-entry</name>
-		<tag-class>com.liferay.taglib.ui.AppViewSearchEntryTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>actionJsp</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>containerIcon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>containerName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>containerSrc</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>containerType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>description</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>fileEntryTuples</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>locked</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>mbMessages</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>queryTerms</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowCheckerId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowCheckerName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showCheckbox</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>status</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>thumbnailSrc</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>versions</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-categories-error</name>
-		<tag-class>com.liferay.taglib.ui.AssetCategoriesErrorTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>asset-categories-navigation</name>
-		<tag-class>com.liferay.taglib.ui.AssetCategoriesNavigationTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>hidePortletWhenEmpty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>vocabularyIds</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-categories-selector</name>
-		<tag-class>com.liferay.taglib.ui.AssetCategoriesSelectorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>contentCallback</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>curCategoryIds</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hiddenInput</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-categories-summary</name>
-		<tag-class>com.liferay.taglib.ui.AssetCategoriesSummaryTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-links</name>
-		<tag-class>com.liferay.taglib.ui.AssetLinksTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>assetEntryId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-tags-error</name>
-		<tag-class>com.liferay.taglib.ui.AssetTagsErrorTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>asset-tags-navigation</name>
-		<tag-class>com.liferay.taglib.ui.AssetTagsNavigationTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>classNameId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hidePortletWhenEmpty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>maxAssetTags</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showAssetCount</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showZeroAssetCount</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-tags-selector</name>
-		<tag-class>com.liferay.taglib.ui.AssetTagsSelectorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>contentCallback</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>curTags</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>groupIds</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hiddenInput</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>asset-tags-summary</name>
-		<tag-class>com.liferay.taglib.ui.AssetTagsSummaryTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>assetTagNames</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>breadcrumb</name>
-		<tag-class>com.liferay.taglib.ui.BreadcrumbTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>selLayout</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>selLayoutParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showCurrentGroup</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showCurrentPortlet</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showGuestGroup</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showLayout</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showParentGroups</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showPortletBreadcrumb</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>calendar</name>
-		<tag-class>com.liferay.taglib.ui.CalendarTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>day</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>headerFormat</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>headerPattern</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>month</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showAllPotentialWeeks</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>year</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>captcha</name>
-		<tag-class>com.liferay.taglib.ui.CaptchaTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>categorization-filter</name>
-		<tag-class>com.liferay.taglib.ui.CategorizationFilterTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>assetType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>custom-attribute</name>
-		<tag-class>com.liferay.taglib.ui.CustomAttributeTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>editable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>custom-attribute-list</name>
-		<tag-class>com.liferay.taglib.ui.CustomAttributeListTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>editable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ignoreAttributeNames</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>custom-attributes-available</name>
-		<tag-class>com.liferay.taglib.ui.CustomAttributesAvailableTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>companyId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ignoreAttributeNames</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>editable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>ddm-template-selector</name>
-		<tag-class>com.liferay.taglib.ui.DDMTemplateSelectorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>classNameId</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyleGroupId</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyles</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>icon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>refreshURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showEmptyOption</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>diff</name>
-		<tag-class>com.liferay.taglib.ui.DiffTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>diffResults</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>sourceName</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>targetName</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>diff-html</name>
-		<tag-class>com.liferay.taglib.ui.DiffHtmlTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>diffHtmlResults</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>discussion</name>
-		<tag-class>com.liferay.taglib.ui.DiscussionTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>assetEntryVisible</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formAction</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hideControls</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>permissionClassName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>permissionClassPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ratingsEnabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>redirect</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Deprecated as of 6.2.0, with no direct replacement</description>
-			<name>subject</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>userId</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>error</name>
-		<tag-class>com.liferay.taglib.ui.ErrorTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.ErrorTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>exception</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>focusField</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>key</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowBreak</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>translateMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>error-marker</name>
-		<tag-class>com.liferay.taglib.ui.ErrorMarkerTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>key</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>flags</name>
-		<tag-class>com.liferay.taglib.ui.FlagsTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>contentTitle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>reportedUserId</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>flash</name>
-		<tag-class>com.liferay.taglib.ui.FlashTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>allowFullScreen</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>allowScriptAccess</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>base</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>bgcolor</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>devicefont</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>flashvars</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>height</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>loop</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>menu</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>movie</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>play</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>quality</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>salign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>scale</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>swliveconnect</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>version</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>width</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>wmode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>form-navigator</name>
-		<tag-class>com.liferay.taglib.ui.FormNavigatorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>backURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>categoryNames</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>categorySections</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>htmlBottom</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>htmlTop</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>jspPath</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showButtons</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>group-search</name>
-		<tag-class>com.liferay.taglib.ui.GroupSearchTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>groupParams</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowChecker</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>header</name>
-		<tag-class>com.liferay.taglib.ui.HeaderTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>backLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>backURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>escapeXml</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>localizeTitle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showBackURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>icon</name>
-		<tag-class>com.liferay.taglib.ui.IconTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>alt</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ariaRole</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>data</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>iconCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>image</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>imageHover</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>lang</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>linkCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>localizeMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>method</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>src</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>srcHover</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>toolTip</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>useDialog</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>icon-deactivate</name>
-		<tag-class>com.liferay.taglib.ui.IconDeactivateTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>icon-delete</name>
-		<tag-class>com.liferay.taglib.ui.IconDeleteTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>confirmation</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>image</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>label</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>method</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>trash</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>icon-help</name>
-		<tag-class>com.liferay.taglib.ui.IconHelpTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>message</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>icon-list</name>
-		<tag-class>com.liferay.taglib.ui.IconListTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>showWhenSingleIcon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>icon-menu</name>
-		<tag-class>com.liferay.taglib.ui.IconMenuTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>direction</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>extended</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>icon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>localizeMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>maxDisplayItems</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>select</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showExpanded</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showArrow</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showWhenSingleIcon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>triggerCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>useIconCaret</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-asset-links</name>
-		<tag-class>com.liferay.taglib.ui.InputAssetLinksTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>assetEntryId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-checkbox</name>
-		<tag-class>com.liferay.taglib.ui.InputCheckBoxTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>param</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-date</name>
-		<tag-class>com.liferay.taglib.ui.InputDateTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>dayParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>dayValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disableNamespace</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>firstDayOfWeek</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>monthAndYearParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>monthParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>monthValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>yearParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>yearValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-editor</name>
-		<tag-class>com.liferay.taglib.ui.InputEditorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>configParams</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>contentsLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>editorImpl</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>inlineEdit</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>inlineEditSaveURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>fileBrowserParams</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>height</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>initMethod</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onBlurMethod</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onChangeMethod</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onFocusMethod</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>resizable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>skipEditorLoading</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>toolbarSet</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>width</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-field</name>
-		<tag-class>com.liferay.taglib.ui.InputFieldTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>autoSize</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>bean</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>dateTogglerCheckboxLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>field</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>fieldParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>format</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ignoreRequestValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>languageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>model</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>placeholder</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-localized</name>
-		<tag-class>com.liferay.taglib.ui.InputLocalizedTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>autoSize</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>availableLocales</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultLanguageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayWidth</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ignoreRequestValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>languageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>maxLength</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>xml</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<dynamic-attributes>true</dynamic-attributes>
-	</tag>
-	<tag>
-		<name>input-move-boxes</name>
-		<tag-class>com.liferay.taglib.ui.InputMoveBoxesTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>leftBoxName</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>leftList</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>leftOnChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>leftReorder</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>leftTitle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rightBoxName</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rightList</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rightOnChange</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rightReorder</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rightTitle</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-permissions</name>
-		<tag-class>com.liferay.taglib.ui.InputPermissionsTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>modelName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-permissions-params</name>
-		<tag-class>com.liferay.taglib.ui.InputPermissionsParamsTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>modelName</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-repeat</name>
-		<tag-class>com.liferay.taglib.ui.InputRepeatTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>event</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-resource</name>
-		<tag-class>com.liferay.taglib.ui.InputResourceTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-scheduler</name>
-		<tag-class>com.liferay.taglib.ui.InputSchedulerTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>input-search</name>
-		<tag-class>com.liferay.taglib.ui.InputSearchTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>buttonLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>placeholder</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showButton</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-select</name>
-		<tag-class>com.liferay.taglib.ui.InputSelectTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>param</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-textarea</name>
-		<tag-class>com.liferay.taglib.ui.InputTextAreaTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>param</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-time</name>
-		<tag-class>com.liferay.taglib.ui.InputTimeTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>amPmParam</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>amPmValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>dateParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>dateValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hourParam</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hourValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>minuteInterval</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>minuteParam</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>minuteValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>input-time-zone</name>
-		<tag-class>com.liferay.taglib.ui.InputTimeZoneTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>daylight</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>disabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>nullable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>journal-article</name>
-		<tag-class>com.liferay.taglib.ui.JournalArticleTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>articleId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>articlePage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>articleResourcePrimKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>groupId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>languageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showAvailableLocales</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showTitle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>templateId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>xmlRequest</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>journal-content-search</name>
-		<tag-class>com.liferay.taglib.ui.JournalContentSearchTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>showListed</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>targetPortletId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>language</name>
-		<tag-class>com.liferay.taglib.ui.LanguageTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>displayCurrentLocale</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formAction</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>languageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>languageIds</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>logo-selector</name>
-		<tag-class>com.liferay.taglib.ui.LogoSelectorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>defaultLogoURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>editLogoURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>imageId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>logoDisplaySelector</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showBackground</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>membership-policy-error</name>
-		<tag-class>com.liferay.taglib.ui.MembershipPolicyErrorTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>message</name>
-		<tag-class>com.liferay.taglib.ui.MessageTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>arguments</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>key</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>localizeKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>translateArguments</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>unicode</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>my-sites</name>
-		<tag-class>com.liferay.taglib.ui.MySitesTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>classNames</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>includeControlPanel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>max</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>navigation</name>
-		<tag-class>com.liferay.taglib.ui.NavigationTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bulletStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>headerType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>includedLayouts</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>nestedChildren</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>preview</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rootLayoutLevel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rootLayoutType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>page-iterator</name>
-		<tag-class>com.liferay.taglib.ui.PageIteratorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cur</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>curParam</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>delta</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>deltaConfigurable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>deltaParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>jsCall</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>maxPages</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>total</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>panel</name>
-		<tag-class>com.liferay.taglib.ui.PanelTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>collapsible</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>extended</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>helpMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>iconCssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>parentId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>persistState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>state</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>panel-container</name>
-		<tag-class>com.liferay.taglib.ui.PanelContainerTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>accordion</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>extended</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>persistState</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>param</name>
-		<tag-class>com.liferay.taglib.util.ParamTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>png-image</name>
-		<tag-class>com.liferay.taglib.ui.PngImageTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>height</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>image</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>width</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>progress</name>
-		<tag-class>com.liferay.taglib.ui.ProgressTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>height</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>sessionKey</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>updatePeriod</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>ratings</name>
-		<tag-class>com.liferay.taglib.ui.RatingsTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>numberOfStars</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ratingsEntry</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>ratingsStats</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>ratings-score</name>
-		<tag-class>com.liferay.taglib.ui.RatingsScoreTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>score</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>restore-entry</name>
-		<tag-class>com.liferay.taglib.ui.RestoreEntryTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>duplicateEntryAction</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>overrideMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>renameMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>restoreEntryAction</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>rss</name>
-		<tag-class>com.liferay.taglib.ui.RSSTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>delta</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>resourceURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>rss-settings</name>
-		<tag-class>com.liferay.taglib.ui.RSSSettingsTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>delta</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyles</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>enabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>nameEnabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search</name>
-		<tag-class>com.liferay.taglib.ui.SearchTag</tag-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>search-container</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.SearchContainerTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>curParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>delta</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>deltaConfigurable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>deltaParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayTerms</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>emptyResultsMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>headerNames</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hover</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>iteratorURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderByCol</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderByColParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderByComparator</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderByType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderByTypeParam</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowChecker</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchContainer</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchTerms</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>total</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>totalVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-column-button</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerColumnButtonTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>colspan</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>index</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>valign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-column-date</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerColumnDateTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>colspan</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>index</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderableProperty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>property</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>valign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-column-jsp</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerColumnJSPTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>colspan</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>index</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>path</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>valign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-column-status</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerColumnStatusTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>colspan</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>index</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderableProperty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>property</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>valign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>status</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>statusByUserId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>statusDate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-column-text</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerColumnTextTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.SearchContainerColumnTextTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>buffer</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>colspan</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>href</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>index</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>name</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderable</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>orderableProperty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>property</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>translate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>valign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-results</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerResultsTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.SearchContainerResultsTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>results</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>resultsVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Deprecated as of 6.2.0, replaced by liferay-ui:search-container#total</description>
-			<name>total</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Deprecated as of 6.2.0, replaced by liferay-ui:search-container#totalVar</description>
-			<name>totalVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-row</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerRowTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.SearchContainerRowTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bold</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>escapedModel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>indexVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>keyProperty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>modelVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowIdProperty</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>servletContext</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>stringKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-container-row-parameter</name>
-		<tag-class>com.liferay.taglib.ui.SearchContainerRowParameterTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-form</name>
-		<tag-class>com.liferay.taglib.ui.SearchFormTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>page</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchContainer</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>servletContext</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showAddButton</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-iterator</name>
-		<tag-class>com.liferay.taglib.ui.SearchIteratorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>paginate</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchContainer</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-paginator</name>
-		<tag-class>com.liferay.taglib.ui.SearchPaginatorTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchContainer</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-speed</name>
-		<tag-class>com.liferay.taglib.ui.SearchSpeedTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>hits</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>searchContainer</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>search-toggle</name>
-		<tag-class>com.liferay.taglib.ui.SearchToggleTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>autoFocus</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>buttonLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayTerms</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>width</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>section</name>
-		<tag-class>com.liferay.taglib.ui.SectionTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.SectionTei</tei-class>
-		<body-content>JSP</body-content>
-	</tag>
-	<tag>
-		<name>sites-directory</name>
-		<tag-class>com.liferay.taglib.ui.SitesDirectoryTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>sites</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>social-activities</name>
-		<tag-class>com.liferay.taglib.ui.SocialActivitiesTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>activities</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>className</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>classPK</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayRSSFeed</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedDelta</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedDisplayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedEnabled</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedLink</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedLinkMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedTitle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>feedType</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>social-bookmark</name>
-		<tag-class>com.liferay.taglib.ui.SocialBookmarkTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>contentId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>social-bookmarks</name>
-		<tag-class>com.liferay.taglib.ui.SocialBookmarksTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>contentId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>target</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>title</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>types</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>staging</name>
-		<tag-class>com.liferay.taglib.ui.StagingTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>cssClass</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>extended</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>groupId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>icon</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>layoutSetBranchId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onlyActions</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>privateLayout</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>selPlid</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showManageBranches</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>success</name>
-		<tag-class>com.liferay.taglib.ui.SuccessTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>key</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>translateMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>table-iterator</name>
-		<tag-class>com.liferay.taglib.ui.TableIteratorTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.TableIteratorTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bodyPage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>list</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>listType</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowBreak</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowLength</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowPadding</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowValign</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>width</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>tabs</name>
-		<tag-class>com.liferay.taglib.ui.TabsTag</tag-class>
-		<body-content>JSP</body-content>
-		<!--
-		values is a reserved property, so we have to use tabsValues intead
-		-->
-		<attribute>
-			<name>backLabel</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>backURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>formName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>names</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>onClick</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>param</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>refresh</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>tabsValues</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>type</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url0</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url1</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url2</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url3</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url4</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url5</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url6</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url7</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url8</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url9</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>toggle</name>
-		<tag-class>com.liferay.taglib.ui.ToggleTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>defaultShowContent</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hideImage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hideMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showImage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>stateVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>toggle-area</name>
-		<tag-class>com.liferay.taglib.ui.ToggleAreaTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>align</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>defaultShowContent</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hideImage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>hideMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showImage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>showMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>stateVar</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>toggle-value</name>
-		<tag-class>com.liferay.taglib.ui.ToggleValueTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>defaultValue</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>trash-empty</name>
-		<tag-class>com.liferay.taglib.ui.TrashEmptyTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>confirmMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>emptyMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>infoMessage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletURL</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>totalEntries</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>trash-undo</name>
-		<tag-class>com.liferay.taglib.ui.TrashUndoTag</tag-class>
-		<body-content>empty</body-content>
-		<attribute>
-			<name>portletURL</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>redirect</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>upload-progress</name>
-		<tag-class>com.liferay.taglib.ui.UploadProgressTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>height</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>id</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>redirect</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>updatePeriod</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>user-display</name>
-		<tag-class>com.liferay.taglib.ui.UserDisplayTag</tag-class>
-		<tei-class>com.liferay.taglib.ui.UserDisplayTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>displayStyle</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>userId</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>userName</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>user-search</name>
-		<tag-class>com.liferay.taglib.ui.UserSearchTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>portletURL</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>rowChecker</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>userParams</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>webdav</name>
-		<tag-class>com.liferay.taglib.ui.WebDAVTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>path</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>write</name>
-		<tag-class>com.liferay.taglib.ui.WriteTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>bean</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>property</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-util.tld b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-util.tld
deleted file mode 100644
index a76a426..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/tld/liferay-util.tld
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-
-<taglib>
-	<tlib-version>1.2</tlib-version>
-	<jsp-version>1.1</jsp-version>
-	<short-name>liferay-util</short-name>
-	<uri>http://liferay.com/tld/util</uri>
-	<tag>
-		<name>body-bottom</name>
-		<tag-class>com.liferay.taglib.util.BodyBottomTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>outputKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>body-top</name>
-		<tag-class>com.liferay.taglib.util.BodyTopTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>outputKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>buffer</name>
-		<tag-class>com.liferay.taglib.util.BufferTag</tag-class>
-		<tei-class>com.liferay.taglib.util.BufferTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>var</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>get-url</name>
-		<tag-class>com.liferay.taglib.util.GetUrlTag</tag-class>
-		<tei-class>com.liferay.taglib.util.GetUrlTei</tei-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>expires</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>url</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>html-bottom</name>
-		<tag-class>com.liferay.taglib.util.HtmlBottomTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>outputKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>position</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>html-top</name>
-		<tag-class>com.liferay.taglib.util.HtmlTopTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>outputKey</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>position</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>include</name>
-		<tag-class>com.liferay.taglib.util.IncludeTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>page</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>portletId</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>servletContext</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>strict</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>useCustomPage</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-	<tag>
-		<name>param</name>
-		<tag-class>com.liferay.taglib.util.ParamTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-</taglib>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/web.xml b/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/web.xml
deleted file mode 100644
index 6b61e7e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/WEB-INF/web.xml
+++ /dev/null
@@ -1,149 +0,0 @@
-<?xml version="1.0"?>
-
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-	<display-name>marketplace-portlet</display-name>
-	<context-param>
-		<param-name>portalContextConfigLocation</param-name>
-		<param-value>/WEB-INF/classes/META-INF/messaging-spring.xml</param-value>
-	</context-param>
-	<filter>
-		<filter-name>Invoker Filter - ERROR</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter</filter-class>
-		<init-param>
-			<param-name>dispatcher</param-name>
-			<param-value>ERROR</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Invoker Filter - FORWARD</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter</filter-class>
-		<init-param>
-			<param-name>dispatcher</param-name>
-			<param-value>FORWARD</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Invoker Filter - INCLUDE</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter</filter-class>
-		<init-param>
-			<param-name>dispatcher</param-name>
-			<param-value>INCLUDE</param-value>
-		</init-param>
-	</filter>
-	<filter>
-		<filter-name>Invoker Filter - REQUEST</filter-name>
-		<filter-class>com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter</filter-class>
-		<init-param>
-			<param-name>dispatcher</param-name>
-			<param-value>REQUEST</param-value>
-		</init-param>
-	</filter>
-	<filter-mapping>
-		<filter-name>Invoker Filter - ERROR</filter-name>
-		<url-pattern>/*</url-pattern>
-		<dispatcher>ERROR</dispatcher>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Invoker Filter - FORWARD</filter-name>
-		<url-pattern>/*</url-pattern>
-		<dispatcher>FORWARD</dispatcher>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Invoker Filter - INCLUDE</filter-name>
-		<url-pattern>/*</url-pattern>
-		<dispatcher>INCLUDE</dispatcher>
-	</filter-mapping>
-	<filter-mapping>
-		<filter-name>Invoker Filter - REQUEST</filter-name>
-		<url-pattern>/*</url-pattern>
-		<dispatcher>REQUEST</dispatcher>
-	</filter-mapping>
-	<listener>
-		<listener-class>com.liferay.portal.kernel.servlet.PluginContextListener</listener-class>
-	</listener>
-	<listener>
-		<listener-class>com.liferay.portal.kernel.servlet.SerializableSessionAttributeListener</listener-class>
-	</listener>
-	<servlet>
-		<servlet-name>1 Servlet</servlet-name>
-		<servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class>
-		<init-param>
-			<param-name>portlet-class</param-name>
-			<param-value>com.liferay.marketplace.store.portlet.StorePortlet</param-value>
-		</init-param>
-		<load-on-startup>1</load-on-startup>
-	</servlet>
-	<servlet>
-		<servlet-name>2 Servlet</servlet-name>
-		<servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class>
-		<init-param>
-			<param-name>portlet-class</param-name>
-			<param-value>com.liferay.marketplace.store.portlet.StorePortlet</param-value>
-		</init-param>
-		<load-on-startup>1</load-on-startup>
-	</servlet>
-	<servlet>
-		<servlet-name>3 Servlet</servlet-name>
-		<servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class>
-		<init-param>
-			<param-name>portlet-class</param-name>
-			<param-value>com.liferay.marketplace.appmanager.portlet.AppManagerPortlet</param-value>
-		</init-param>
-		<load-on-startup>1</load-on-startup>
-	</servlet>
-	<servlet>
-		<servlet-name>Dynamic Resource Servlet</servlet-name>
-		<servlet-class>com.liferay.portal.kernel.servlet.PortalClassLoaderServlet</servlet-class>
-		<init-param>
-			<param-name>servlet-class</param-name>
-			<param-value>com.liferay.portal.webserver.DynamicResourceServlet</param-value>
-		</init-param>
-		<load-on-startup>1</load-on-startup>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>1 Servlet</servlet-name>
-		<url-pattern>/1/*</url-pattern>
-	</servlet-mapping>
-	<servlet-mapping>
-		<servlet-name>2 Servlet</servlet-name>
-		<url-pattern>/2/*</url-pattern>
-	</servlet-mapping>
-	<servlet-mapping>
-		<servlet-name>3 Servlet</servlet-name>
-		<url-pattern>/3/*</url-pattern>
-	</servlet-mapping>
-	<servlet-mapping>
-		<servlet-name>Dynamic Resource Servlet</servlet-name>
-		<url-pattern>/sprite/*</url-pattern>
-	</servlet-mapping>
-	<jsp-config>
-		<taglib>
-			<taglib-uri>http://liferay.com/tld/aui</taglib-uri>
-			<taglib-location>/WEB-INF/tld/aui.tld</taglib-location>
-		</taglib>
-		<taglib>
-			<taglib-uri>http://java.sun.com/portlet_2_0</taglib-uri>
-			<taglib-location>/WEB-INF/tld/liferay-portlet.tld</taglib-location>
-		</taglib>
-		<taglib>
-			<taglib-uri>http://liferay.com/tld/portlet</taglib-uri>
-			<taglib-location>/WEB-INF/tld/liferay-portlet-ext.tld</taglib-location>
-		</taglib>
-		<taglib>
-			<taglib-uri>http://liferay.com/tld/security</taglib-uri>
-			<taglib-location>/WEB-INF/tld/liferay-security.tld</taglib-location>
-		</taglib>
-		<taglib>
-			<taglib-uri>http://liferay.com/tld/theme</taglib-uri>
-			<taglib-location>/WEB-INF/tld/liferay-theme.tld</taglib-location>
-		</taglib>
-		<taglib>
-			<taglib-uri>http://liferay.com/tld/ui</taglib-uri>
-			<taglib-location>/WEB-INF/tld/liferay-ui.tld</taglib-location>
-		</taglib>
-		<taglib>
-			<taglib-uri>http://liferay.com/tld/util</taglib-uri>
-			<taglib-location>/WEB-INF/tld/liferay-util.tld</taglib-location>
-		</taglib>
-	</jsp-config>
-</web-app>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/categories.jspf b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/categories.jspf
deleted file mode 100644
index 53ea4d9..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/categories.jspf
+++ /dev/null
@@ -1,54 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<%
-List<App> allApps = AppLocalServiceUtil.getApps(QueryUtil.ALL_POS, QueryUtil.ALL_POS);
-
-List<String> categories = ListUtil.fromArray(StringUtil.split(ListUtil.toString(allApps, "category")));
-
-ListUtil.distinct(categories);
-ListUtil.sort(categories);
-%>
-
-<ul class="nav nav-list">
-	<li class="nav-header">
-		<liferay-ui:message key="categories" />
-	</li>
-	<li class="<%= category.equals(StringPool.BLANK) ? "active" : StringPool.BLANK %>">
-
-		<%
-		portletURL.setParameter("category", StringPool.BLANK);
-		%>
-
-		<a href="<%= portletURL.toString() %>"><liferay-ui:message key="all-apps" /></a>
-	</li>
-
-	<%
-	for (String curCategory : categories) {
-		portletURL.setParameter("category", curCategory);
-	%>
-
-		<li class="<%= category.equals(curCategory) ? "active" : StringPool.BLANK %>">
-			<a href="<%= portletURL.toString() %>"><%= curCategory %></a>
-		</li>
-
-	<%
-	}
-
-	portletURL.setParameter("category", category);
-	%>
-
-</ul>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/css/.sass-cache/main.css b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/css/.sass-cache/main.css
deleted file mode 100644
index 648477f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/css/.sass-cache/main.css
+++ /dev/null
@@ -1,61 +0,0 @@
-.marketplace-portlet .alert-container {
-  left: 3em;
-  position: fixed;
-  top: 3em;
-  z-index: 100; }
-  .marketplace-portlet .alert-container .alert {
-    margin-bottom: .5em; }
-.marketplace-portlet .row {
-  margin-left: 0; }
-.marketplace-portlet .category-nav {
-  padding-left: 0;
-  padding-right: 0; }
-.marketplace-portlet .app {
-  clear: both;
-  min-height: 90px;
-  margin-bottom: 2.5em;
-  position: relative; }
-  .marketplace-portlet .app .icon {
-    background: white url(../images/app.png) no-repeat;
-    float: left;
-    height: 90px;
-    width: 90px; }
-  .marketplace-portlet .app .info {
-    margin-left: 110px; }
-  .marketplace-portlet .app .app-actions {
-    position: absolute;
-    right: 0;
-    top: 0; }
-  .marketplace-portlet .app .title {
-    color: #009EC3;
-    font-size: 1.5em;
-    font-weight: bold;
-    margin-bottom: .2em; }
-  .marketplace-portlet .app .sub-title {
-    color: #999;
-    font-size: .8em; }
-  .marketplace-portlet .app .description {
-    margin-right: 132px; }
-  .marketplace-portlet .app .plugins {
-    margin-top: 1em; }
-    .marketplace-portlet .app .plugins ul {
-      margin-bottom: 0;
-      margin-top: 0; }
-    .marketplace-portlet .app .plugins .summary {
-      cursor: pointer;
-      margin: 0; }
-      .marketplace-portlet .app .plugins .summary li {
-        display: inline;
-        margin-right: .5em; }
-    .marketplace-portlet .app .plugins .table td {
-      vertical-align: middle; }
-    .marketplace-portlet .app .plugins .table td:last-child {
-      text-align: right; }
-    .marketplace-portlet .app .plugins .plugin-list {
-      display: none;
-      margin-top: 1em; }
-    .marketplace-portlet .app .plugins.active .plugin-list {
-      display: block; }
-.marketplace-portlet .install-apps .control-group {
-  margin-left: 20px; }
-
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/css/main.css b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/css/main.css
deleted file mode 100644
index eb33d7f..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/css/main.css
+++ /dev/null
@@ -1,103 +0,0 @@
-.marketplace-portlet {
-	.alert-container {
-		left: 3em;
-		position: fixed;
-		top: 3em;
-		z-index: 100;
-
-		.alert {
-			margin-bottom: .5em;
-		}
-	}
-
-	.row {
-		margin-left: 0;
-	}
-
-	.category-nav {
-		padding-left: 0;
-		padding-right: 0;
-	}
-
-	.app {
-		clear: both;
-		min-height: 90px;
-		margin-bottom: 2.5em;
-		position: relative;
-
-		.icon {
-			background: #FFF url(../images/app.png) no-repeat;
-			float: left;
-			height: 90px;
-			width: 90px;
-		}
-
-		.info {
-			margin-left: 110px;
-		}
-
-		.app-actions {
-			position: absolute;
-			right: 0;
-			top: 0;
-		}
-
-		.title {
-			color: #009EC3;
-			font-size: 1.5em;
-			font-weight: bold;
-			margin-bottom: .2em;
-		}
-
-		.sub-title {
-			color: #999;
-			font-size: .8em;
-		}
-
-		.description {
-			margin-right: 132px;
-		}
-
-		.plugins {
-			margin-top: 1em;
-
-			ul {
-				margin-bottom: 0;
-				margin-top: 0;
-			}
-
-			.summary {
-				cursor: pointer;
-				margin: 0;
-
-				li {
-					display: inline;
-					margin-right: .5em;
-				}
-			}
-
-			.table {
-				td {
-					vertical-align: middle;
-				}
-
-				td:last-child {
-					text-align: right;
-				}
-			}
-
-			.plugin-list {
-				display: none;
-				margin-top: 1em;
-			}
-
-			&.active .plugin-list {
-				display: block;
-			}
-		}
-	}
-
-	.install-apps .control-group {
-		margin-left: 20px;
-	}
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/icon.png b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/icon.png
deleted file mode 100644
index ce892a1..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/icon.png
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/images/app.png b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/images/app.png
deleted file mode 100644
index cb135e8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/images/app.png
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/install_apps.jspf b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/install_apps.jspf
deleted file mode 100644
index c543519..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/install_apps.jspf
+++ /dev/null
@@ -1,67 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<portlet:actionURL name="installApp" var="installAppURL" />
-
-<aui:form action="<%= installAppURL %>" cssClass="install-apps" enctype="multipart/form-data" method="post" name="fm1">
-	<aui:input name="redirect" type="hidden" value="<%= portletURL.toString() %>" />
-
-	<c:if test="<%= CompanyLocalServiceUtil.getCompaniesCount(false) > 1 %>">
-		<div class="alert alert-info">
-			<liferay-ui:message key="installed-apps-are-available-to-all-portal-instances.-go-to-plugins-configuration-within-each-portal-instance-to-enable-disable-each-app" />
-		</div>
-	</c:if>
-
-	<aui:fieldset label="install">
-		<liferay-ui:success key="pluginUploaded" message="the-plugin-was-uploaded-successfully-and-is-now-being-installed" />
-
-		<liferay-ui:success key="pluginDownloaded" message="the-plugin-was-downloaded-successfully-and-is-now-being-installed" />
-
-		<div class="install-method local">
-			<liferay-ui:error exception="<%= UploadException.class %>" message="an-unexpected-error-occurred-while-uploading-your-file" />
-
-			<aui:input label="file-upload-lpkg-or-war-file" name="installMethod" type="radio" value="local" />
-
-			<aui:input cssClass="file-input" label="" name="file" type="file" />
-		</div>
-
-		<div class="install-method remote">
-			<liferay-ui:error key="invalidUrl" message="please-enter-a-valid-url" />
-
-			<aui:input label="url" name="installMethod" type="radio" value="remote" />
-
-			<aui:input cssClass="file-input" label="" name="url" type="text" />
-		</div>
-
-		<aui:button type="submit" value="install" />
-	</aui:fieldset>
-</aui:form>
-
-<aui:script use="aui-base">
-	A.one('.marketplace-portlet .install-method.local .file-input').on(
-		'change',
-		function(event) {
-			A.one('.marketplace-portlet .install-method.local input[type=radio]').attr('checked', true);
-		}
-	);
-
-	A.one('.marketplace-portlet .install-method.remote .file-input').on(
-		'click',
-		function(event) {
-			A.one('.marketplace-portlet .install-method.remote input[type=radio]').attr('checked', true);
-		}
-	);
-</aui:script>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/manage.jspf b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/manage.jspf
deleted file mode 100644
index 3b57f7e..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/manage.jspf
+++ /dev/null
@@ -1,361 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<%
-String category = ParamUtil.getString(request, "category");
-
-portletURL.setParameter("category", category);
-%>
-
-<liferay-ui:error exception="<%= RequiredPluginPackageException.class %>" message="unable-to-uninstall-app-or-plugin-because-it-is-required" />
-
-<div class="row">
-	<div class="span3">
-		<div class="alert-container"></div>
-
-		<div class="category-nav well">
-			<%@ include file="/app_manager/categories.jspf" %>
-		</div>
-	</div>
-
-	<div class="apps span9">
-		<h3>
-			<c:choose>
-				<c:when test="<%= Validator.isNull(category) %>">
-					<liferay-ui:message key="all-apps" />
-				</c:when>
-				<c:otherwise>
-					<%= category %>
-				</c:otherwise>
-			</c:choose>
-		</h3>
-
-		<%
-		List<App> apps = null;
-
-		if (Validator.isNotNull(category)) {
-			apps = AppLocalServiceUtil.getApps(category);
-		}
-		else {
-			apps = AppLocalServiceUtil.getInstalledApps();
-		}
-
-		for (App app : apps) {
-			List<LayoutTemplate> layoutTemplates = new ArrayList<LayoutTemplate>();
-			List<Portlet> portlets = new ArrayList<Portlet>();
-			List<Theme> themes = new ArrayList<Theme>();
-
-			boolean displayActions = true;
-
-			for (String contextName : app.getContextNames()) {
-				ServletContext servletContext = ServletContextPool.get(contextName);
-
-				if (servletContext == null) {
-					continue;
-				}
-
-				List<LayoutTemplate> servletContextLayoutTemplates = (List<LayoutTemplate>)servletContext.getAttribute(WebKeys.PLUGIN_LAYOUT_TEMPLATES);
-
-				if (servletContextLayoutTemplates != null) {
-					layoutTemplates.addAll(servletContextLayoutTemplates);
-
-					Iterator<LayoutTemplate> itr = layoutTemplates.iterator();
-
-					while (itr.hasNext()) {
-						LayoutTemplate layoutTemplate = itr.next();
-
-						if (layoutTemplate.isStandard()) {
-							itr.remove();
-						}
-					}
-				}
-
-				List<Portlet> servletContextPortlets = (List<Portlet>)servletContext.getAttribute(WebKeys.PLUGIN_PORTLETS);
-
-				if (servletContextPortlets != null) {
-					portlets.addAll(servletContextPortlets);
-
-					Iterator<Portlet> itr = portlets.iterator();
-
-					while (itr.hasNext()) {
-						Portlet portlet = itr.next();
-
-						String curPortletId = portlet.getPortletId();
-
-						if (curPortletId.equals(PortletKeys.PORTAL)) {
-							itr.remove();
-						}
-						else if (portlet.isSystem()) {
-							itr.remove();
-						}
-					}
-				}
-
-				List<Theme> servletContextThemes = (List<Theme>)servletContext.getAttribute(WebKeys.PLUGIN_THEMES);
-
-				if (servletContextThemes != null) {
-					themes.addAll(servletContextThemes);
-				}
-
-				if (contextName.equals(PortalUtil.getPathContext())) {
-					displayActions = false;
-				}
-				else if (DeployManagerUtil.isRequiredDeploymentContext(contextName)) {
-					displayActions = false;
-				}
-			}
-
-			List plugins = new ArrayList(layoutTemplates.size() + portlets.size() + themes.size());
-
-			plugins.addAll(layoutTemplates);
-			plugins.addAll(portlets);
-			plugins.addAll(themes);
-
-			plugins = ListUtil.sort(plugins, new PluginComparator(application, locale));
-		%>
-
-			<div class="app">
-				<div class="icon">
-					<c:if test="<%= Validator.isNotNull(app.getIconURL()) %>">
-						<img src="<%= app.getIconURL() %>" />
-					</c:if>
-				</div>
-
-				<div class="info">
-					<div class="title">
-						<%= app.getTitle() %>
-					</div>
-
-					<div class="description">
-						<%= app.getDescription() %>
-					</div>
-
-					<div class="plugins well">
-						<c:choose>
-							<c:when test="<%= !plugins.isEmpty() %>">
-								<ul class="summary">
-									<li class="switch">
-										<i class="icon-chevron-right"></i>
-									</li>
-
-									<li>
-										<liferay-ui:message key="this-app-contains" />
-									</li>
-
-									<c:if test="<%= !layoutTemplates.isEmpty() %>">
-										<li>
-											<%= layoutTemplates.size() %> <liferay-ui:message key='<%= layoutTemplates.size() == 1 ? "layout-template" : "layout-templates" %>' />
-										</li>
-									</c:if>
-
-									<c:if test="<%= !portlets.isEmpty() %>">
-										<li>
-											<%= portlets.size() %> <liferay-ui:message key='<%= portlets.size() == 1 ? "portlet" : "portlets" %>' />
-										</li>
-									</c:if>
-
-									<c:if test="<%= !themes.isEmpty() %>">
-										<li>
-											<%= themes.size() %> <liferay-ui:message key='<%= themes.size() == 1 ? "theme" : "themes" %>' />
-										</li>
-									</c:if>
-								</ul>
-
-								<div class="plugin-list">
-									<%@ include file="/app_manager/plugins.jspf" %>
-								</div>
-							</c:when>
-							<c:otherwise>
-								<liferay-ui:message key="there-are-no-configurable-plugins-for-this-app" />
-							</c:otherwise>
-						</c:choose>
-					</div>
-				</div>
-
-				<c:if test="<%= displayActions %>">
-					<div class="app-actions">
-						<liferay-ui:icon-menu>
-							<liferay-portlet:actionURL name="updatePluginSettings" var="activateURL">
-								<portlet:param name="contextNames" value="<%= StringUtil.merge(app.getContextNames()) %>" />
-								<portlet:param name="active" value="<%= String.valueOf(true) %>" />
-							</liferay-portlet:actionURL>
-
-							<liferay-ui:icon
-								image="activate"
-								url="<%= activateURL %>"
-							/>
-
-							<liferay-portlet:actionURL name="updatePluginSettings" var="deactivateURL">
-								<portlet:param name="contextNames" value="<%= StringUtil.merge(app.getContextNames()) %>" />
-								<portlet:param name="active" value="<%= String.valueOf(false) %>" />
-							</liferay-portlet:actionURL>
-
-							<liferay-ui:icon
-								image="deactivate"
-								url="<%= deactivateURL %>"
-							/>
-
-							<liferay-portlet:actionURL name="uninstallApp" var="uninstallURL">
-								<portlet:param name="remoteAppId" value="<%= String.valueOf(app.getRemoteAppId()) %>" />
-								<portlet:param name="contextNames" value="<%= StringUtil.merge(app.getContextNames()) %>" />
-								<portlet:param name="activate" value="<%= String.valueOf(false) %>" />
-							</liferay-portlet:actionURL>
-
-							<liferay-ui:icon-delete
-								confirmation="are-you-sure-you-want-to-uninstall-this"
-								message="uninstall"
-								url="<%= uninstallURL %>"
-							/>
-						</liferay-ui:icon-menu>
-					</div>
-				</c:if>
-			</div>
-
-		<%
-		}
-		%>
-
-	</div>
-</div>
-
-<aui:script use="anim,aui-base,aui-io,aui-tooltip,aui-url">
-	var marketplacePortlet = A.one('.marketplace-portlet');
-
-	marketplacePortlet.delegate(
-		'click',
-		function(event) {
-			var targetNode = event.currentTarget;
-
-			var pluginsContainer = targetNode.ancestor('.plugins');
-
-			var pluginSwitch = pluginsContainer.one('.switch i');
-			var pluginList = pluginsContainer.one('.plugin-list');
-
-			if (pluginsContainer.hasClass('active')) {
-				pluginsContainer.removeClass('active');
-
-				pluginSwitch.setAttribute('class', 'icon-chevron-right');
-			}
-			else {
-				pluginsContainer.addClass('active');
-
-				pluginSwitch.setAttribute('class', 'icon-chevron-down');
-			}
-		},
-		'ul.summary'
-	);
-
-	var showMessage = function(message) {
-		marketplacePortlet.one('.alert-container').prepend(message);
-
-		setTimeout(
-			function() {
-				new A.Anim(
-					{
-						node: message,
-						on: {
-							end: function() {
-								var node = this.get('node');
-
-								node.get('parentNode').removeChild(node);
-							}
-						},
-						to: {
-							opacity: 0
-						}
-					}
-				).run();
-			},
-			2000
-		);
-	};
-
-	marketplacePortlet.delegate(
-		'click',
-		function(event) {
-			event.preventDefault();
-
-			var actionButton = event.currentTarget;
-
-			if (actionButton.hasClass('disabled')) {
-				return;
-			}
-
-			actionButton.addClass('disabled');
-
-			var url = new A.Url(actionButton.getAttribute('href'));
-
-			if (actionButton.hasClass('activate')) {
-				url.setParameter('<portlet:namespace />active', true);
-			}
-			else if (actionButton.hasClass('deactivate')) {
-				url.setParameter('<portlet:namespace />active', false);
-			}
-
-			A.io.request(
-				url.toString(),
-				{
-					after: {
-						complete: function(event, id, obj) {
-							actionButton.removeClass('disabled');
-						}
-					},
-					method: 'post',
-					on: {
-						failure: function(event, id, obj) {
-							showMessage(
-								A.Node.create(
-									'<div class="alert alert-error">' +
-										'<i class="icon-minus-sign"></i> <liferay-ui:message key="an-unexpected-error-occurred" />' +
-									'</div>'
-								)
-							);
-						},
-						success: function(event, id, obj) {
-							if (actionButton.hasClass('activate')) {
-								actionButton.setAttribute('class', 'btn btn-mini btn-success deactivate');
-
-								actionButton.html('<liferay-ui:message key="active" />');
-							}
-							else if (actionButton.hasClass('deactivate')) {
-								actionButton.setAttribute('class', 'btn btn-mini btn-danger activate');
-
-								actionButton.html('<liferay-ui:message key="inactive" />');
-							}
-
-							showMessage(
-								A.Node.create(
-									'<div class="alert alert-success">' +
-										'<i class="icon-ok"></i> <liferay-ui:message key="your-request-completed-successfully" />' +
-									'</div>'
-								)
-							);
-						}
-					}
-				}
-			);
-		},
-		'.plugin-actions .btn'
-	);
-
-	new A.TooltipDelegate(
-		{
-			position: 'top',
-			trigger: '.marketplace-portlet .apps i.icon-wrench',
-			zIndex: 100
-		}
-	);
-</aui:script>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/plugins.jspf b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/plugins.jspf
deleted file mode 100644
index e1a21d8..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/plugins.jspf
+++ /dev/null
@@ -1,216 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<table class="table table-condensed">
-	<thead>
-		<tr>
-			<th>
-				<liferay-ui:message key="name" />
-			</th>
-			<th>
-				<liferay-ui:message key="type" />
-			</th>
-			<th>
-			</th>
-		</tr>
-	</thead>
-
-	<%
-	for (Object plugin : plugins) {
-	%>
-
-		<c:choose>
-			<c:when test="<%= plugin instanceof LayoutTemplate %>">
-
-				<%
-				LayoutTemplate layoutTemplate = (LayoutTemplate)plugin;
-				%>
-
-				<tr>
-					<td>
-						<%= layoutTemplate.getName() %>
-					</td>
-					<td>
-						<liferay-ui:message key="layout-template" />
-					</td>
-					<td class="plugin-actions">
-
-						<%
-						PluginSetting pluginSetting = PluginSettingLocalServiceUtil.getPluginSetting(company.getCompanyId(), layoutTemplate.getLayoutTemplateId(), Plugin.TYPE_LAYOUT_TEMPLATE);
-						%>
-
-						<c:choose>
-							<c:when test="<%= pluginSetting.isActive() %>">
-								<liferay-portlet:actionURL name="updatePluginSetting" var="deactivateURL">
-									<portlet:param name="pluginId" value="<%= layoutTemplate.getLayoutTemplateId() %>" />
-									<portlet:param name="pluginType" value="<%= Plugin.TYPE_LAYOUT_TEMPLATE %>" />
-									<portlet:param name="active" value="<%= String.valueOf(false) %>" />
-								</liferay-portlet:actionURL>
-
-								<a class="btn btn-mini btn-success deactivate" href="<%= deactivateURL %>"><liferay-ui:message key="active" /></a>
-							</c:when>
-							<c:otherwise>
-								<liferay-portlet:actionURL name="updatePluginSetting" var="activateURL">
-									<portlet:param name="pluginId" value="<%= layoutTemplate.getLayoutTemplateId() %>" />
-									<portlet:param name="pluginType" value="<%= Plugin.TYPE_LAYOUT_TEMPLATE %>" />
-									<portlet:param name="active" value="<%= String.valueOf(true) %>" />
-								</liferay-portlet:actionURL>
-
-								<a class="btn btn-mini btn-danger activate" href="<%= activateURL %>"><liferay-ui:message key="inactive" /></a>
-							</c:otherwise>
-						</c:choose>
-					</td>
-				</tr>
-			</c:when>
-			<c:when test="<%= plugin instanceof Portlet %>">
-
-				<%
-				Portlet portlet = (Portlet)plugin;
-
-				portlet = PortletLocalServiceUtil.getPortletById(themeDisplay.getCompanyId(), portlet.getPortletId());
-				%>
-
-				<tr>
-					<td>
-
-						<%
-						String title = PortalUtil.getPortletTitle(portlet, application, locale);
-						%>
-
-						<%= title %>
-
-						<c:if test="<%= !title.equals(portlet.getDisplayName()) %>">
-							<span class="sub-title">(<%= portlet.getDisplayName() %>)</span>
-						</c:if>
-					</td>
-					<td>
-						<liferay-ui:message key="portlet" />
-
-						<%
-						String controlPanelEntryCategory = portlet.getControlPanelEntryCategory();
-						%>
-
-						<c:if test="<%= Validator.isNotNull(controlPanelEntryCategory) %>">
-
-							<%
-							String tooltipTitle = StringPool.BLANK;
-
-							if (controlPanelEntryCategory.startsWith(PortletCategoryKeys.SITE_ADMINISTRATION)) {
-								tooltipTitle = "this-portlet-is-available-in-site-administration";
-							}
-							else if (controlPanelEntryCategory.equals(PortletCategoryKeys.MY)) {
-								tooltipTitle = "this-portlet-is-available-in-my-account";
-							}
-							else {
-								tooltipTitle = "this-portlet-is-available-in-the-control-panel";
-							}
-							%>
-
-							<i class="icon-wrench" data-title="<liferay-ui:message key="<%= tooltipTitle %>" />"></i>
-						</c:if>
-					</td>
-					<td class="plugin-actions">
-
-						<%
-						List<String> indexerClasses = portlet.getIndexerClasses();
-						%>
-
-						<c:if test="<%= !indexerClasses.isEmpty() %>">
-
-							<%
-							LiferayPortletURL reindexURL = PortletURLFactoryUtil.create(request, PortletKeys.ADMIN, themeDisplay.getPlid(), PortletRequest.ACTION_PHASE);
-
-							reindexURL.setParameter("struts_action", "/admin/edit_server");
-							reindexURL.setParameter(Constants.CMD, "reindex");
-							reindexURL.setParameter("redirect", PortalUtil.getCurrentURL(request));
-							reindexURL.setParameter("portletId", portlet.getPortletId());
-							%>
-
-							<a class="btn btn-mini btn-info reindex" href="<%= reindexURL %>"><liferay-ui:message key="reindex-search" /></a>
-						</c:if>
-
-						<c:choose>
-							<c:when test="<%= portlet.isActive() %>">
-								<liferay-portlet:actionURL name="updatePluginSetting" var="deactivateURL">
-									<portlet:param name="pluginId" value="<%= portlet.getPortletId() %>" />
-									<portlet:param name="pluginType" value="<%= Plugin.TYPE_PORTLET %>" />
-									<portlet:param name="active" value="<%= String.valueOf(false) %>" />
-								</liferay-portlet:actionURL>
-
-								<a class="btn btn-mini btn-success deactivate" href="<%= deactivateURL %>"><liferay-ui:message key="active" /></a>
-							</c:when>
-							<c:otherwise>
-								<liferay-portlet:actionURL name="updatePluginSetting" var="activateURL">
-									<portlet:param name="pluginId" value="<%= portlet.getPortletId() %>" />
-									<portlet:param name="pluginType" value="<%= Plugin.TYPE_PORTLET %>" />
-									<portlet:param name="active" value="<%= String.valueOf(true) %>" />
-								</liferay-portlet:actionURL>
-
-								<a class="btn btn-mini btn-danger activate" href="<%= activateURL %>"><liferay-ui:message key="inactive" /></a>
-							</c:otherwise>
-						</c:choose>
-					</td>
-				</tr>
-			</c:when>
-			<c:when test="<%= plugin instanceof Theme %>">
-
-				<%
-				Theme curTheme = (Theme)plugin;
-				%>
-
-				<tr>
-					<td>
-						<%= curTheme.getName() %>
-					</td>
-					<td>
-						<liferay-ui:message key="theme" />
-					</td>
-					<td class="plugin-actions">
-
-						<%
-						PluginSetting pluginSetting = PluginSettingLocalServiceUtil.getPluginSetting(company.getCompanyId(), curTheme.getThemeId(), Plugin.TYPE_THEME);
-						%>
-
-						<c:choose>
-							<c:when test="<%= pluginSetting.isActive() %>">
-								<liferay-portlet:actionURL name="updatePluginSetting" var="deactivateURL">
-									<portlet:param name="pluginId" value="<%= curTheme.getThemeId() %>" />
-									<portlet:param name="pluginType" value="<%= Plugin.TYPE_THEME %>" />
-									<portlet:param name="active" value="<%= String.valueOf(false) %>" />
-								</liferay-portlet:actionURL>
-
-								<a class="btn btn-mini btn-success deactivate" href="<%= deactivateURL %>"><liferay-ui:message key="active" /></a>
-							</c:when>
-							<c:otherwise>
-								<liferay-portlet:actionURL name="updatePluginSetting" var="activateURL">
-									<portlet:param name="pluginId" value="<%= curTheme.getThemeId() %>" />
-									<portlet:param name="pluginType" value="<%= Plugin.TYPE_THEME %>" />
-									<portlet:param name="active" value="<%= String.valueOf(true) %>" />
-								</liferay-portlet:actionURL>
-
-								<a class="btn btn-mini btn-danger activate" href="<%= activateURL %>"><liferay-ui:message key="inactive" /></a>
-							</c:otherwise>
-						</c:choose>
-					</td>
-				</tr>
-			</c:when>
-		</c:choose>
-
-	<%
-	}
-	%>
-
-</table>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/view.jsp b/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/view.jsp
deleted file mode 100644
index e6e7f33..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/app_manager/view.jsp
+++ /dev/null
@@ -1,57 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<%@ include file="/init.jsp" %>
-
-<%
-String toolbarItem = ParamUtil.getString(request, "toolbarItem", "manage");
-
-PortletURL portletURL = renderResponse.createRenderURL();
-
-portletURL.setParameter("mvcPath", "/app_manager/view.jsp");
-portletURL.setParameter("toolbarItem", toolbarItem);
-%>
-
-<aui:nav-bar>
-	<aui:nav>
-
-		<%
-		portletURL.setParameter("toolbarItem", "manage");
-		%>
-
-		<aui:nav-item href="<%= portletURL.toString() %>" label="manage" selected='<%= toolbarItem.equals("manage") %>' />
-
-		<%
-		portletURL.setParameter("toolbarItem", "install");
-		%>
-
-		<aui:nav-item href="<%= portletURL.toString() %>" label="install" selected='<%= toolbarItem.equals("install") %>' />
-
-		<%
-		portletURL.setParameter("toolbarItem", toolbarItem);
-		%>
-
-	</aui:nav>
-</aui:nav-bar>
-
-<c:choose>
-	<c:when test='<%= toolbarItem.equals("install") %>'>
-		<%@ include file="/app_manager/install_apps.jspf" %>
-	</c:when>
-	<c:otherwise>
-		<%@ include file="/app_manager/manage.jspf" %>
-	</c:otherwise>
-</c:choose>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/init.jsp b/tomcat-7.0.42/webapps/marketplace-portlet/init.jsp
deleted file mode 100644
index 2aa91d2..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/init.jsp
+++ /dev/null
@@ -1,89 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-
-<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
-
-<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
-<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
-<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
-<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
-
-<%@ page import="com.liferay.marketplace.model.App" %><%@
-page import="com.liferay.marketplace.service.AppLocalServiceUtil" %><%@
-page import="com.liferay.marketplace.util.MarketplaceConstants" %><%@
-page import="com.liferay.marketplace.util.PortletKeys" %><%@
-page import="com.liferay.marketplace.util.comparator.PluginComparator" %><%@
-page import="com.liferay.portal.kernel.dao.orm.QueryUtil" %><%@
-page import="com.liferay.portal.kernel.deploy.DeployManagerUtil" %><%@
-page import="com.liferay.portal.kernel.plugin.RequiredPluginPackageException" %><%@
-page import="com.liferay.portal.kernel.portlet.LiferayPortletURL" %><%@
-page import="com.liferay.portal.kernel.servlet.ServletContextPool" %><%@
-page import="com.liferay.portal.kernel.upload.UploadException" %><%@
-page import="com.liferay.portal.kernel.util.Constants" %><%@
-page import="com.liferay.portal.kernel.util.ListUtil" %><%@
-page import="com.liferay.portal.kernel.util.ParamUtil" %><%@
-page import="com.liferay.portal.kernel.util.ServerDetector" %><%@
-page import="com.liferay.portal.kernel.util.StringPool" %><%@
-page import="com.liferay.portal.kernel.util.StringUtil" %><%@
-page import="com.liferay.portal.kernel.util.Validator" %><%@
-page import="com.liferay.portal.kernel.util.WebKeys" %><%@
-page import="com.liferay.portal.model.LayoutTemplate" %><%@
-page import="com.liferay.portal.model.Plugin" %><%@
-page import="com.liferay.portal.model.PluginSetting" %><%@
-page import="com.liferay.portal.model.Portlet" %><%@
-page import="com.liferay.portal.model.Theme" %><%@
-page import="com.liferay.portal.service.CompanyLocalServiceUtil" %><%@
-page import="com.liferay.portal.service.PluginSettingLocalServiceUtil" %><%@
-page import="com.liferay.portal.service.PortletLocalServiceUtil" %><%@
-page import="com.liferay.portal.util.PortalUtil" %><%@
-page import="com.liferay.portal.util.PortletCategoryKeys" %><%@
-page import="com.liferay.portlet.PortletURLFactoryUtil" %>
-
-<%@ page import="java.util.ArrayList" %><%@
-page import="java.util.Iterator" %><%@
-page import="java.util.List" %>
-
-<%@ page import="javax.portlet.PortletRequest" %><%@
-page import="javax.portlet.PortletURL" %><%@
-page import="javax.portlet.WindowState" %>
-
-<%@ page import="javax.servlet.ServletContext" %>
-
-<portlet:defineObjects />
-
-<liferay-theme:defineObjects />
-
-<%
-long appId = ParamUtil.getLong(request, "appId");
-
-String portletId = portletDisplay.getId();
-
-String iFrameURL = MarketplaceConstants.MARKETPLACE_URL_LOGOUT;
-
-String referer = StringPool.BLANK;
-
-if (portletId.equals(PortletKeys.MY_MARKETPLACE)) {
-	referer = MarketplaceConstants.getPathPurchased();
-}
-else if (portletId.equals(PortletKeys.STORE) && (appId > 0)) {
-	referer = MarketplaceConstants.getPathStore() + "/application/" + appId;
-}
-else {
-	referer = MarketplaceConstants.getPathStore();
-}
-%>
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/my_marketplace/icon.png b/tomcat-7.0.42/webapps/marketplace-portlet/my_marketplace/icon.png
deleted file mode 100644
index 70a6a62..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/my_marketplace/icon.png
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/store/css/.sass-cache/main.css b/tomcat-7.0.42/webapps/marketplace-portlet/store/css/.sass-cache/main.css
deleted file mode 100644
index 9f28dfe..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/store/css/.sass-cache/main.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.marketplace-portlet iframe {
-  border-width: 0;
-  min-width: 975px;
-  width: 100%; }
-
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/store/css/main.css b/tomcat-7.0.42/webapps/marketplace-portlet/store/css/main.css
deleted file mode 100644
index d3dc8b3..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/store/css/main.css
+++ /dev/null
@@ -1,5 +0,0 @@
-.marketplace-portlet iframe {
-	border-width: 0;
-	min-width: 975px;
-	width: 100%;
-}
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/store/icon.png b/tomcat-7.0.42/webapps/marketplace-portlet/store/icon.png
deleted file mode 100644
index b983b77..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/store/icon.png
+++ /dev/null
Binary files differ
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/store/js/main.js b/tomcat-7.0.42/webapps/marketplace-portlet/store/js/main.js
deleted file mode 100644
index d302546..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/store/js/main.js
+++ /dev/null
@@ -1,121 +0,0 @@
-AUI.add(
-	'liferay-marketplace-messenger',
-	function(A) {
-		var NATIVE_MSG = !!(window.postMessage);
-
-		var MarketplaceMessenger = {
-			init: function(options, initMessage) {
-				var instance = this;
-
-				if (A.Lang.isString(options)) {
-					instance._targetURI = options;
-				}
-				else if (A.Lang.isObject(options)) {
-					instance._targetFrame = options.targetFrame;
-					instance._targetURI = options.targetURI;
-				}
-
-				if (initMessage) {
-					instance.postMessage(initMessage);
-				}
-			},
-
-			postMessage: function(message) {
-				var instance = this;
-
-				if (NATIVE_MSG) {
-					A.postMessage(message, instance._targetURI, instance._targetFrame);
-				}
-				else {
-					instance._messages.push(message);
-
-					if (instance._messages.length == 1) {
-						A.postMessage(message, instance._targetURI, instance._targetFrame);
-					}
-				}
-			},
-
-			receiveMessage: function(callback, validator) {
-				var instance = this;
-
-				validator = validator || instance._targetURI;
-
-				if (NATIVE_MSG) {
-					A.receiveMessage(callback, validator);
-				}
-				else {
-					var wrappedCallback = function(event) {
-						var response = event.responseData;
-
-						callback(event);
-
-						instance._messages.shift();
-
-						var message = null;
-
-						if (instance._messages.length > 0) {
-							message = instance._messages[0];
-						}
-						else if (!response.empty) {
-							message = {
-								empty: true
-							};
-						}
-
-						if (message) {
-							A.postMessage(message, instance._targetURI, instance._targetFrame);
-						}
-					};
-
-					A.receiveMessage(wrappedCallback, validator);
-				}
-			},
-
-			setTargetFrame: function(targetFrame) {
-				this._targetFrame = targetFrame;
-			},
-
-			setTargetURI: function(targetURI) {
-				this._targetURI = targetURI;
-			},
-
-			_messages: [],
-			_targetFrame: null,
-			_targetURI: null
-		};
-
-		Liferay.MarketplaceMessenger = MarketplaceMessenger;
-	},
-	'',
-	{
-		requires: ['aui-messaging']
-	}
-);
-
-AUI.add(
-	'liferay-marketplace-util',
-	function(A) {
-		var MarketplaceUtil = {
-			namespaceObject: function(namespace, object) {
-				var returnObject = {};
-
-				var keys = A.Object.keys(object);
-
-				A.Array.each(
-					keys,
-					function(key) {
-						returnObject[namespace + key] = object[key];
-					}
-				);
-
-				return returnObject;
-			}
-		};
-
-		Liferay.MarketplaceUtil = MarketplaceUtil;
-	},
-	'',
-	{
-		requires: ['aui-base']
-	}
-);
\ No newline at end of file
diff --git a/tomcat-7.0.42/webapps/marketplace-portlet/store/view.jsp b/tomcat-7.0.42/webapps/marketplace-portlet/store/view.jsp
deleted file mode 100644
index a1f8d00..0000000
--- a/tomcat-7.0.42/webapps/marketplace-portlet/store/view.jsp
+++ /dev/null
@@ -1,130 +0,0 @@
-<%--
-/**
- * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- */
---%>
-
-<%@ include file="/init.jsp" %>
-
-<div class="loading-animation">
-	<iframe class="hide-accessible" frameborder="0" id="<portlet:namespace />frame" name="<portlet:namespace />frame" scrolling="no" src="about:blank"></iframe>
-</div>
-
-<form action="<%= iFrameURL %>" id="<portlet:namespace />fm" method="post" target="<portlet:namespace />frame">
-<input name="referer" type="hidden" value="<%= referer %>" />
-<input name="mpClientURL" type="hidden" value="<%= themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() %>" />
-</form>
-
-<div class="alert alert-error hide time-out-message">
-	<liferay-ui:message key="could-not-connect-to-the-liferay-marketplace" />
-</div>
-
-<aui:script use="aui-base,aui-io,liferay-marketplace-messenger,liferay-marketplace-util">
-	var frame = A.one('#<portlet:namespace />frame');
-
-	var timeout = setTimeout(
-		function() {
-			frame.ancestor().removeClass('loading-animation');
-			A.one('.time-out-message').show();
-		},
-		120000
-	);
-
-	Liferay.MarketplaceMessenger.init(
-		{
-			targetFrame: frame
-		}
-	);
-
-	Liferay.MarketplaceMessenger.receiveMessage(
-		function(event) {
-			var response = event.responseData;
-
-			if (!response.cmd) {
-				return;
-			}
-
-			if (response.cmd == 'init') {
-				clearTimeout(timeout);
-
-				frame.removeClass('hide-accessible');
-
-				frame.ancestor().removeClass('loading-animation');
-
-				Liferay.MarketplaceMessenger.setTargetURI(response.serverURL);
-
-				if (response.height) {
-					frame.height(response.height + 50);
-				}
-
-				if (response.width) {
-					frame.width(response.width);
-				}
-
-				Liferay.MarketplaceMessenger.postMessage(
-					{
-						message: 'success',
-						supportsHotDeploy: <%= ServerDetector.isSupportsHotDeploy() %>
-					}
-				);
-			}
-			else if (response.cmd == 'goto') {
-				var url = null;
-
-				if (response.panel === "control-panel") {
-					url = '<%= themeDisplay.getURLControlPanel() %>';
-				}
-				else {
-					url = '<liferay-portlet:renderURL doAsGroupId="<%= themeDisplay.getScopeGroupId() %>" portletName="<%= portletId.equals(PortletKeys.STORE) ? PortletKeys.MY_MARKETPLACE : PortletKeys.STORE %>" windowState="<%= WindowState.MAXIMIZED.toString() %>" />';
-
-					if (response.appId) {
-						url = Liferay.Util.addParams('appId=' + response.appId, url);
-					}
-				}
-
-				window.location = url;
-			}
-			else if (response.cmd == 'resize') {
-				if (response.height) {
-					frame.height(response.height + 50);
-				}
-
-				if (response.width) {
-					frame.width(response.width);
-				}
-			}
-			else {
-				var data = Liferay.MarketplaceUtil.namespaceObject('<portlet:namespace />', response);
-
-				A.io.request(
-					'<portlet:actionURL />',
-					{
-						data: data,
-						dataType: 'JSON',
-						method: 'POST',
-						on: {
-							success: function(event, id, obj) {
-								var response = this.get('responseData');
-
-								Liferay.MarketplaceMessenger.postMessage(response);
-							}
-						}
-					}
-				);
-			}
-		},
-		A.Lang.emptyFnTrue
-	);
-
-	A.one('#<portlet:namespace />fm').submit();
-</aui:script>
\ No newline at end of file
