diff --git a/app/models/rack.js b/app/models/rack.js
index f192f225e3fce1ff70b01abe9ef0e28a0b549bd5..4a949b7e245e13b17c0b6cb5b8f63a3e1c5564fd 100644
--- a/app/models/rack.js
+++ b/app/models/rack.js
@@ -1,3 +1,4 @@
+
 import Ember from 'ember';
 import DS from 'ember-data';
 
diff --git a/lf7-sdk/.gitignore b/lf7-sdk/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5909c7b8a42b85b872ab97929ab6a1d3295814d1
--- /dev/null
+++ b/lf7-sdk/.gitignore
@@ -0,0 +1,24 @@
+**/*.iml
+**/.ivy
+**/.classpath
+**/.project
+**/.sass-cache
+**/.settings
+**/bin
+**/build
+**/build_gradle
+**/node_modules
+**/test-coverage
+**/tmp
+**/.web_bundle_build
+.gradle
+.idea
+/bundles
+/plugins-sdk/**/classes
+/plugins-sdk/**/ivy.xml.MD5
+/plugins-sdk/**/liferay-hook.xml.processed
+/plugins-sdk/build.*.properties
+/plugins-sdk/dependencies/**/*.jar
+/plugins-sdk/dist
+/plugins-sdk/lib
+test-results
\ No newline at end of file
diff --git a/lf7-sdk/build.gradle b/lf7-sdk/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lf7-sdk/configs/dev/portal-ext.properties b/lf7-sdk/configs/dev/portal-ext.properties
new file mode 100644
index 0000000000000000000000000000000000000000..684f347947173ec8f6320b498064345cfa4cfdc2
--- /dev/null
+++ b/lf7-sdk/configs/dev/portal-ext.properties
@@ -0,0 +1,9 @@
+include-and-override=portal-developer.properties
+
+#
+# MySQL
+#
+#jdbc.default.driverClassName=com.mysql.jdbc.Driver
+#jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
+#jdbc.default.username=root
+#jdbc.default.password=
\ No newline at end of file
diff --git a/lf7-sdk/configs/local/portal-ext.properties b/lf7-sdk/configs/local/portal-ext.properties
new file mode 100644
index 0000000000000000000000000000000000000000..684f347947173ec8f6320b498064345cfa4cfdc2
--- /dev/null
+++ b/lf7-sdk/configs/local/portal-ext.properties
@@ -0,0 +1,9 @@
+include-and-override=portal-developer.properties
+
+#
+# MySQL
+#
+#jdbc.default.driverClassName=com.mysql.jdbc.Driver
+#jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
+#jdbc.default.username=root
+#jdbc.default.password=
\ No newline at end of file
diff --git a/lf7-sdk/configs/prod/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg b/lf7-sdk/configs/prod/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..95fb5bdf45c032d72dde4844bb892b96fc90b914
--- /dev/null
+++ b/lf7-sdk/configs/prod/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
@@ -0,0 +1,2 @@
+operationMode=REMOTE
+transportAddresses=127.0.0.1:9300
\ No newline at end of file
diff --git a/lf7-sdk/configs/prod/portal-ext.properties b/lf7-sdk/configs/prod/portal-ext.properties
new file mode 100644
index 0000000000000000000000000000000000000000..03a2642622b863f47f9dab23642dc0c1ed8b6d53
--- /dev/null
+++ b/lf7-sdk/configs/prod/portal-ext.properties
@@ -0,0 +1,7 @@
+#
+# MySQL
+#
+#jdbc.default.driverClassName=com.mysql.jdbc.Driver
+#jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
+#jdbc.default.username=root
+#jdbc.default.password=
\ No newline at end of file
diff --git a/lf7-sdk/configs/uat/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg b/lf7-sdk/configs/uat/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..1c9ab58861ba818ee66b2af82d47af3abd412b43
--- /dev/null
+++ b/lf7-sdk/configs/uat/osgi/configs/com.liferay.portal.search.elasticsearch.configuration.ElasticsearchConfiguration.cfg
@@ -0,0 +1,3 @@
+operationMode=REMOTE
+transportAddresses=127.0.0.1:9300
+logExceptionsOnly=false
\ No newline at end of file
diff --git a/lf7-sdk/configs/uat/portal-ext.properties b/lf7-sdk/configs/uat/portal-ext.properties
new file mode 100644
index 0000000000000000000000000000000000000000..03a2642622b863f47f9dab23642dc0c1ed8b6d53
--- /dev/null
+++ b/lf7-sdk/configs/uat/portal-ext.properties
@@ -0,0 +1,7 @@
+#
+# MySQL
+#
+#jdbc.default.driverClassName=com.mysql.jdbc.Driver
+#jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
+#jdbc.default.username=root
+#jdbc.default.password=
\ No newline at end of file
diff --git a/lf7-sdk/gradle.properties b/lf7-sdk/gradle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e55a0325e4eeb376b9ceb703d200ea55da3ebf84
--- /dev/null
+++ b/lf7-sdk/gradle.properties
@@ -0,0 +1,11 @@
+liferay.workspace.bundle.url=https://cdn.lfrs.sl/releases.liferay.com/portal/7.0.2-ga3/liferay-ce-portal-tomcat-7.0-ga3-20160804222206210.zip
+#liferay.workspace.environment=local
+#liferay.workspace.home.dir=bundles
+#liferay.workspace.modules.default.repository.enabled=false
+#liferay.workspace.modules.dir=modules
+#liferay.workspace.plugins.sdk.dir=plugins-sdk
+#liferay.workspace.themes.dir=themes
+#liferay.workspace.wars.dir=wars
+
+microsoft.translator.client.id=
+microsoft.translator.client.secret=
diff --git a/lf7-sdk/gradle/wrapper/gradle-wrapper.jar b/lf7-sdk/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..deedc7fa5e6310eac3148a7dd0b1f069b07364cb
Binary files /dev/null and b/lf7-sdk/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/lf7-sdk/gradle/wrapper/gradle-wrapper.properties b/lf7-sdk/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d511181ebfa6680c7801664f1f6b25e70bf497e0
--- /dev/null
+++ b/lf7-sdk/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Aug 18 11:52:36 CDT 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
diff --git a/lf7-sdk/gradlew b/lf7-sdk/gradlew
new file mode 100755
index 0000000000000000000000000000000000000000..9aa616c273d8c0be67cb25eaac11e07209f5c034
--- /dev/null
+++ b/lf7-sdk/gradlew
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/lf7-sdk/gradlew.bat b/lf7-sdk/gradlew.bat
new file mode 100644
index 0000000000000000000000000000000000000000..f9553162f122c71b34635112e717c3e733b5b212
--- /dev/null
+++ b/lf7-sdk/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/lf7-sdk/modules/embercellar/.gitignore b/lf7-sdk/modules/embercellar/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c19c17241560653304a3faab48207f3494756d44
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/.gitignore
@@ -0,0 +1,3 @@
+.gradle/
+build/
+target/
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/build.gradle b/lf7-sdk/modules/embercellar/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/bnd.bnd b/lf7-sdk/modules/embercellar/embercellar-api/bnd.bnd
new file mode 100644
index 0000000000000000000000000000000000000000..9518b2e9bec72ec466258d37b1e41f09c845a5e8
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/bnd.bnd
@@ -0,0 +1,9 @@
+Bundle-Name: embercellar-api
+Bundle-SymbolicName: fr.ippon.services.embercellar.api
+Bundle-Version: 1.0.0
+Export-Package:\
+	fr.ippon.services.embercellar.exception,\
+	fr.ippon.services.embercellar.model,\
+	fr.ippon.services.embercellar.service,\
+	fr.ippon.services.embercellar.service.persistence
+-includeresource: META-INF/service.xml=../embercellar-service/service.xml
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/build.gradle b/lf7-sdk/modules/embercellar/embercellar-api/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..f2ccf5fd065173dd7620944bb5116cf22469a7e9
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/build.gradle
@@ -0,0 +1,6 @@
+dependencies {
+	compileOnly group: "biz.aQute.bnd", name: "biz.aQute.bndlib", version: "3.1.0"
+	compileOnly group: "com.liferay", name: "com.liferay.osgi.util", version: "3.0.0"
+	compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
+	compileOnly group: "org.osgi", name: "org.osgi.core", version: "6.0.0"
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/exception/NoSuchBottleException.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/exception/NoSuchBottleException.java
new file mode 100644
index 0000000000000000000000000000000000000000..6953ced5b3f095cb49a2f040e3d60285d71e441a
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/exception/NoSuchBottleException.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.exception;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.NoSuchModelException;
+
+/**
+ * @author Brian Wing Shun Chan
+ */
+@ProviderType
+public class NoSuchBottleException extends NoSuchModelException {
+
+	public NoSuchBottleException() {
+	}
+
+	public NoSuchBottleException(String msg) {
+		super(msg);
+	}
+
+	public NoSuchBottleException(String msg, Throwable cause) {
+		super(msg, cause);
+	}
+
+	public NoSuchBottleException(Throwable cause) {
+		super(cause);
+	}
+
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/exception/NoSuchRackException.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/exception/NoSuchRackException.java
new file mode 100644
index 0000000000000000000000000000000000000000..713023387ec547830a95fd2bcd0888c244526674
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/exception/NoSuchRackException.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.exception;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.NoSuchModelException;
+
+/**
+ * @author Brian Wing Shun Chan
+ */
+@ProviderType
+public class NoSuchRackException extends NoSuchModelException {
+
+	public NoSuchRackException() {
+	}
+
+	public NoSuchRackException(String msg) {
+		super(msg);
+	}
+
+	public NoSuchRackException(String msg, Throwable cause) {
+		super(msg, cause);
+	}
+
+	public NoSuchRackException(Throwable cause) {
+		super(cause);
+	}
+
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/Bottle.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/Bottle.java
new file mode 100644
index 0000000000000000000000000000000000000000..03ed8e032ffd6ffe4fa85c5e43c713e7cfb817f5
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/Bottle.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.annotation.ImplementationClassName;
+import com.liferay.portal.kernel.model.PersistedModel;
+import com.liferay.portal.kernel.util.Accessor;
+
+/**
+ * The extended model interface for the Bottle service. Represents a row in the "embercellar_Bottle" database table, with each column mapped to a property of this class.
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleModel
+ * @see fr.ippon.services.embercellar.model.impl.BottleImpl
+ * @see fr.ippon.services.embercellar.model.impl.BottleModelImpl
+ * @generated
+ */
+@ImplementationClassName("fr.ippon.services.embercellar.model.impl.BottleImpl")
+@ProviderType
+public interface Bottle extends BottleModel, PersistedModel {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this interface directly. Add methods to {@link fr.ippon.services.embercellar.model.impl.BottleImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
+	 */
+	public static final Accessor<Bottle, Long> BOTTLE_ID_ACCESSOR = new Accessor<Bottle, Long>() {
+			@Override
+			public Long get(Bottle bottle) {
+				return bottle.getBottleId();
+			}
+
+			@Override
+			public Class<Long> getAttributeClass() {
+				return Long.class;
+			}
+
+			@Override
+			public Class<Bottle> getTypeClass() {
+				return Bottle.class;
+			}
+		};
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleModel.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..0dcc2e4b584187d199349d4051e491022358cf42
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleModel.java
@@ -0,0 +1,362 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.expando.kernel.model.ExpandoBridge;
+
+import com.liferay.portal.kernel.bean.AutoEscape;
+import com.liferay.portal.kernel.model.BaseModel;
+import com.liferay.portal.kernel.model.CacheModel;
+import com.liferay.portal.kernel.model.GroupedModel;
+import com.liferay.portal.kernel.model.ShardedModel;
+import com.liferay.portal.kernel.model.StagedAuditedModel;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import java.io.Serializable;
+
+import java.util.Date;
+
+/**
+ * The base model interface for the Bottle service. Represents a row in the &quot;embercellar_Bottle&quot; database table, with each column mapped to a property of this class.
+ *
+ * <p>
+ * This interface and its corresponding implementation {@link fr.ippon.services.embercellar.model.impl.BottleModelImpl} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link fr.ippon.services.embercellar.model.impl.BottleImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see Bottle
+ * @see fr.ippon.services.embercellar.model.impl.BottleImpl
+ * @see fr.ippon.services.embercellar.model.impl.BottleModelImpl
+ * @generated
+ */
+@ProviderType
+public interface BottleModel extends BaseModel<Bottle>, GroupedModel,
+	ShardedModel, StagedAuditedModel {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. All methods that expect a bottle model instance should use the {@link Bottle} interface instead.
+	 */
+
+	/**
+	 * Returns the primary key of this bottle.
+	 *
+	 * @return the primary key of this bottle
+	 */
+	public long getPrimaryKey();
+
+	/**
+	 * Sets the primary key of this bottle.
+	 *
+	 * @param primaryKey the primary key of this bottle
+	 */
+	public void setPrimaryKey(long primaryKey);
+
+	/**
+	 * Returns the uuid of this bottle.
+	 *
+	 * @return the uuid of this bottle
+	 */
+	@AutoEscape
+	@Override
+	public String getUuid();
+
+	/**
+	 * Sets the uuid of this bottle.
+	 *
+	 * @param uuid the uuid of this bottle
+	 */
+	@Override
+	public void setUuid(String uuid);
+
+	/**
+	 * Returns the bottle ID of this bottle.
+	 *
+	 * @return the bottle ID of this bottle
+	 */
+	public long getBottleId();
+
+	/**
+	 * Sets the bottle ID of this bottle.
+	 *
+	 * @param bottleId the bottle ID of this bottle
+	 */
+	public void setBottleId(long bottleId);
+
+	/**
+	 * Returns the group ID of this bottle.
+	 *
+	 * @return the group ID of this bottle
+	 */
+	@Override
+	public long getGroupId();
+
+	/**
+	 * Sets the group ID of this bottle.
+	 *
+	 * @param groupId the group ID of this bottle
+	 */
+	@Override
+	public void setGroupId(long groupId);
+
+	/**
+	 * Returns the company ID of this bottle.
+	 *
+	 * @return the company ID of this bottle
+	 */
+	@Override
+	public long getCompanyId();
+
+	/**
+	 * Sets the company ID of this bottle.
+	 *
+	 * @param companyId the company ID of this bottle
+	 */
+	@Override
+	public void setCompanyId(long companyId);
+
+	/**
+	 * Returns the user ID of this bottle.
+	 *
+	 * @return the user ID of this bottle
+	 */
+	@Override
+	public long getUserId();
+
+	/**
+	 * Sets the user ID of this bottle.
+	 *
+	 * @param userId the user ID of this bottle
+	 */
+	@Override
+	public void setUserId(long userId);
+
+	/**
+	 * Returns the user uuid of this bottle.
+	 *
+	 * @return the user uuid of this bottle
+	 */
+	@Override
+	public String getUserUuid();
+
+	/**
+	 * Sets the user uuid of this bottle.
+	 *
+	 * @param userUuid the user uuid of this bottle
+	 */
+	@Override
+	public void setUserUuid(String userUuid);
+
+	/**
+	 * Returns the user name of this bottle.
+	 *
+	 * @return the user name of this bottle
+	 */
+	@AutoEscape
+	@Override
+	public String getUserName();
+
+	/**
+	 * Sets the user name of this bottle.
+	 *
+	 * @param userName the user name of this bottle
+	 */
+	@Override
+	public void setUserName(String userName);
+
+	/**
+	 * Returns the create date of this bottle.
+	 *
+	 * @return the create date of this bottle
+	 */
+	@Override
+	public Date getCreateDate();
+
+	/**
+	 * Sets the create date of this bottle.
+	 *
+	 * @param createDate the create date of this bottle
+	 */
+	@Override
+	public void setCreateDate(Date createDate);
+
+	/**
+	 * Returns the modified date of this bottle.
+	 *
+	 * @return the modified date of this bottle
+	 */
+	@Override
+	public Date getModifiedDate();
+
+	/**
+	 * Sets the modified date of this bottle.
+	 *
+	 * @param modifiedDate the modified date of this bottle
+	 */
+	@Override
+	public void setModifiedDate(Date modifiedDate);
+
+	/**
+	 * Returns the name of this bottle.
+	 *
+	 * @return the name of this bottle
+	 */
+	@AutoEscape
+	public String getName();
+
+	/**
+	 * Sets the name of this bottle.
+	 *
+	 * @param name the name of this bottle
+	 */
+	public void setName(String name);
+
+	/**
+	 * Returns the flipped of this bottle.
+	 *
+	 * @return the flipped of this bottle
+	 */
+	public boolean getFlipped();
+
+	/**
+	 * Returns <code>true</code> if this bottle is flipped.
+	 *
+	 * @return <code>true</code> if this bottle is flipped; <code>false</code> otherwise
+	 */
+	public boolean isFlipped();
+
+	/**
+	 * Sets whether this bottle is flipped.
+	 *
+	 * @param flipped the flipped of this bottle
+	 */
+	public void setFlipped(boolean flipped);
+
+	/**
+	 * Returns the xcolumn of this bottle.
+	 *
+	 * @return the xcolumn of this bottle
+	 */
+	public int getXcolumn();
+
+	/**
+	 * Sets the xcolumn of this bottle.
+	 *
+	 * @param xcolumn the xcolumn of this bottle
+	 */
+	public void setXcolumn(int xcolumn);
+
+	/**
+	 * Returns the yrow of this bottle.
+	 *
+	 * @return the yrow of this bottle
+	 */
+	public int getYrow();
+
+	/**
+	 * Sets the yrow of this bottle.
+	 *
+	 * @param yrow the yrow of this bottle
+	 */
+	public void setYrow(int yrow);
+
+	/**
+	 * Returns the type of this bottle.
+	 *
+	 * @return the type of this bottle
+	 */
+	@AutoEscape
+	public String getType();
+
+	/**
+	 * Sets the type of this bottle.
+	 *
+	 * @param type the type of this bottle
+	 */
+	public void setType(String type);
+
+	/**
+	 * Returns the rack ID of this bottle.
+	 *
+	 * @return the rack ID of this bottle
+	 */
+	public long getRackId();
+
+	/**
+	 * Sets the rack ID of this bottle.
+	 *
+	 * @param rackId the rack ID of this bottle
+	 */
+	public void setRackId(long rackId);
+
+	@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(fr.ippon.services.embercellar.model.Bottle bottle);
+
+	@Override
+	public int hashCode();
+
+	@Override
+	public CacheModel<fr.ippon.services.embercellar.model.Bottle> toCacheModel();
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle toEscapedModel();
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle toUnescapedModel();
+
+	@Override
+	public String toString();
+
+	@Override
+	public String toXmlString();
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleSoap.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleSoap.java
new file mode 100644
index 0000000000000000000000000000000000000000..80a29822769665e9cca56966cb21ce2c9616ed7d
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleSoap.java
@@ -0,0 +1,233 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+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 fr.ippon.services.embercellar.service.http.BottleServiceSoap}.
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.http.BottleServiceSoap
+ * @generated
+ */
+@ProviderType
+public class BottleSoap implements Serializable {
+	public static BottleSoap toSoapModel(Bottle model) {
+		BottleSoap soapModel = new BottleSoap();
+
+		soapModel.setUuid(model.getUuid());
+		soapModel.setBottleId(model.getBottleId());
+		soapModel.setGroupId(model.getGroupId());
+		soapModel.setCompanyId(model.getCompanyId());
+		soapModel.setUserId(model.getUserId());
+		soapModel.setUserName(model.getUserName());
+		soapModel.setCreateDate(model.getCreateDate());
+		soapModel.setModifiedDate(model.getModifiedDate());
+		soapModel.setName(model.getName());
+		soapModel.setFlipped(model.getFlipped());
+		soapModel.setXcolumn(model.getXcolumn());
+		soapModel.setYrow(model.getYrow());
+		soapModel.setType(model.getType());
+		soapModel.setRackId(model.getRackId());
+
+		return soapModel;
+	}
+
+	public static BottleSoap[] toSoapModels(Bottle[] models) {
+		BottleSoap[] soapModels = new BottleSoap[models.length];
+
+		for (int i = 0; i < models.length; i++) {
+			soapModels[i] = toSoapModel(models[i]);
+		}
+
+		return soapModels;
+	}
+
+	public static BottleSoap[][] toSoapModels(Bottle[][] models) {
+		BottleSoap[][] soapModels = null;
+
+		if (models.length > 0) {
+			soapModels = new BottleSoap[models.length][models[0].length];
+		}
+		else {
+			soapModels = new BottleSoap[0][0];
+		}
+
+		for (int i = 0; i < models.length; i++) {
+			soapModels[i] = toSoapModels(models[i]);
+		}
+
+		return soapModels;
+	}
+
+	public static BottleSoap[] toSoapModels(List<Bottle> models) {
+		List<BottleSoap> soapModels = new ArrayList<BottleSoap>(models.size());
+
+		for (Bottle model : models) {
+			soapModels.add(toSoapModel(model));
+		}
+
+		return soapModels.toArray(new BottleSoap[soapModels.size()]);
+	}
+
+	public BottleSoap() {
+	}
+
+	public long getPrimaryKey() {
+		return _bottleId;
+	}
+
+	public void setPrimaryKey(long pk) {
+		setBottleId(pk);
+	}
+
+	public String getUuid() {
+		return _uuid;
+	}
+
+	public void setUuid(String uuid) {
+		_uuid = uuid;
+	}
+
+	public long getBottleId() {
+		return _bottleId;
+	}
+
+	public void setBottleId(long bottleId) {
+		_bottleId = bottleId;
+	}
+
+	public long getGroupId() {
+		return _groupId;
+	}
+
+	public void setGroupId(long groupId) {
+		_groupId = groupId;
+	}
+
+	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 String getName() {
+		return _name;
+	}
+
+	public void setName(String name) {
+		_name = name;
+	}
+
+	public boolean getFlipped() {
+		return _flipped;
+	}
+
+	public boolean isFlipped() {
+		return _flipped;
+	}
+
+	public void setFlipped(boolean flipped) {
+		_flipped = flipped;
+	}
+
+	public int getXcolumn() {
+		return _xcolumn;
+	}
+
+	public void setXcolumn(int xcolumn) {
+		_xcolumn = xcolumn;
+	}
+
+	public int getYrow() {
+		return _yrow;
+	}
+
+	public void setYrow(int yrow) {
+		_yrow = yrow;
+	}
+
+	public String getType() {
+		return _type;
+	}
+
+	public void setType(String type) {
+		_type = type;
+	}
+
+	public long getRackId() {
+		return _rackId;
+	}
+
+	public void setRackId(long rackId) {
+		_rackId = rackId;
+	}
+
+	private String _uuid;
+	private long _bottleId;
+	private long _groupId;
+	private long _companyId;
+	private long _userId;
+	private String _userName;
+	private Date _createDate;
+	private Date _modifiedDate;
+	private String _name;
+	private boolean _flipped;
+	private int _xcolumn;
+	private int _yrow;
+	private String _type;
+	private long _rackId;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleWrapper.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b478fa6007def9c72e168b960e850731efd53ff
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/BottleWrapper.java
@@ -0,0 +1,643 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.expando.kernel.model.ExpandoBridge;
+
+import com.liferay.exportimport.kernel.lar.StagedModelType;
+
+import com.liferay.portal.kernel.model.ModelWrapper;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * This class is a wrapper for {@link Bottle}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see Bottle
+ * @generated
+ */
+@ProviderType
+public class BottleWrapper implements Bottle, ModelWrapper<Bottle> {
+	public BottleWrapper(Bottle bottle) {
+		_bottle = bottle;
+	}
+
+	@Override
+	public Class<?> getModelClass() {
+		return Bottle.class;
+	}
+
+	@Override
+	public String getModelClassName() {
+		return Bottle.class.getName();
+	}
+
+	@Override
+	public Map<String, Object> getModelAttributes() {
+		Map<String, Object> attributes = new HashMap<String, Object>();
+
+		attributes.put("uuid", getUuid());
+		attributes.put("bottleId", getBottleId());
+		attributes.put("groupId", getGroupId());
+		attributes.put("companyId", getCompanyId());
+		attributes.put("userId", getUserId());
+		attributes.put("userName", getUserName());
+		attributes.put("createDate", getCreateDate());
+		attributes.put("modifiedDate", getModifiedDate());
+		attributes.put("name", getName());
+		attributes.put("flipped", getFlipped());
+		attributes.put("xcolumn", getXcolumn());
+		attributes.put("yrow", getYrow());
+		attributes.put("type", getType());
+		attributes.put("rackId", getRackId());
+
+		return attributes;
+	}
+
+	@Override
+	public void setModelAttributes(Map<String, Object> attributes) {
+		String uuid = (String)attributes.get("uuid");
+
+		if (uuid != null) {
+			setUuid(uuid);
+		}
+
+		Long bottleId = (Long)attributes.get("bottleId");
+
+		if (bottleId != null) {
+			setBottleId(bottleId);
+		}
+
+		Long groupId = (Long)attributes.get("groupId");
+
+		if (groupId != null) {
+			setGroupId(groupId);
+		}
+
+		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);
+		}
+
+		String name = (String)attributes.get("name");
+
+		if (name != null) {
+			setName(name);
+		}
+
+		Boolean flipped = (Boolean)attributes.get("flipped");
+
+		if (flipped != null) {
+			setFlipped(flipped);
+		}
+
+		Integer xcolumn = (Integer)attributes.get("xcolumn");
+
+		if (xcolumn != null) {
+			setXcolumn(xcolumn);
+		}
+
+		Integer yrow = (Integer)attributes.get("yrow");
+
+		if (yrow != null) {
+			setYrow(yrow);
+		}
+
+		String type = (String)attributes.get("type");
+
+		if (type != null) {
+			setType(type);
+		}
+
+		Long rackId = (Long)attributes.get("rackId");
+
+		if (rackId != null) {
+			setRackId(rackId);
+		}
+	}
+
+	/**
+	* Returns the flipped of this bottle.
+	*
+	* @return the flipped of this bottle
+	*/
+	@Override
+	public boolean getFlipped() {
+		return _bottle.getFlipped();
+	}
+
+	@Override
+	public boolean isCachedModel() {
+		return _bottle.isCachedModel();
+	}
+
+	@Override
+	public boolean isEscapedModel() {
+		return _bottle.isEscapedModel();
+	}
+
+	/**
+	* Returns <code>true</code> if this bottle is flipped.
+	*
+	* @return <code>true</code> if this bottle is flipped; <code>false</code> otherwise
+	*/
+	@Override
+	public boolean isFlipped() {
+		return _bottle.isFlipped();
+	}
+
+	@Override
+	public boolean isNew() {
+		return _bottle.isNew();
+	}
+
+	@Override
+	public ExpandoBridge getExpandoBridge() {
+		return _bottle.getExpandoBridge();
+	}
+
+	@Override
+	public com.liferay.portal.kernel.model.CacheModel<fr.ippon.services.embercellar.model.Bottle> toCacheModel() {
+		return _bottle.toCacheModel();
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle toEscapedModel() {
+		return new BottleWrapper(_bottle.toEscapedModel());
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle toUnescapedModel() {
+		return new BottleWrapper(_bottle.toUnescapedModel());
+	}
+
+	@Override
+	public int compareTo(fr.ippon.services.embercellar.model.Bottle bottle) {
+		return _bottle.compareTo(bottle);
+	}
+
+	/**
+	* Returns the xcolumn of this bottle.
+	*
+	* @return the xcolumn of this bottle
+	*/
+	@Override
+	public int getXcolumn() {
+		return _bottle.getXcolumn();
+	}
+
+	/**
+	* Returns the yrow of this bottle.
+	*
+	* @return the yrow of this bottle
+	*/
+	@Override
+	public int getYrow() {
+		return _bottle.getYrow();
+	}
+
+	@Override
+	public int hashCode() {
+		return _bottle.hashCode();
+	}
+
+	@Override
+	public Serializable getPrimaryKeyObj() {
+		return _bottle.getPrimaryKeyObj();
+	}
+
+	@Override
+	public java.lang.Object clone() {
+		return new BottleWrapper((Bottle)_bottle.clone());
+	}
+
+	/**
+	* Returns the name of this bottle.
+	*
+	* @return the name of this bottle
+	*/
+	@Override
+	public java.lang.String getName() {
+		return _bottle.getName();
+	}
+
+	/**
+	* Returns the type of this bottle.
+	*
+	* @return the type of this bottle
+	*/
+	@Override
+	public java.lang.String getType() {
+		return _bottle.getType();
+	}
+
+	/**
+	* Returns the user name of this bottle.
+	*
+	* @return the user name of this bottle
+	*/
+	@Override
+	public java.lang.String getUserName() {
+		return _bottle.getUserName();
+	}
+
+	/**
+	* Returns the user uuid of this bottle.
+	*
+	* @return the user uuid of this bottle
+	*/
+	@Override
+	public java.lang.String getUserUuid() {
+		return _bottle.getUserUuid();
+	}
+
+	/**
+	* Returns the uuid of this bottle.
+	*
+	* @return the uuid of this bottle
+	*/
+	@Override
+	public java.lang.String getUuid() {
+		return _bottle.getUuid();
+	}
+
+	@Override
+	public java.lang.String toString() {
+		return _bottle.toString();
+	}
+
+	@Override
+	public java.lang.String toXmlString() {
+		return _bottle.toXmlString();
+	}
+
+	/**
+	* Returns the create date of this bottle.
+	*
+	* @return the create date of this bottle
+	*/
+	@Override
+	public Date getCreateDate() {
+		return _bottle.getCreateDate();
+	}
+
+	/**
+	* Returns the modified date of this bottle.
+	*
+	* @return the modified date of this bottle
+	*/
+	@Override
+	public Date getModifiedDate() {
+		return _bottle.getModifiedDate();
+	}
+
+	/**
+	* Returns the bottle ID of this bottle.
+	*
+	* @return the bottle ID of this bottle
+	*/
+	@Override
+	public long getBottleId() {
+		return _bottle.getBottleId();
+	}
+
+	/**
+	* Returns the company ID of this bottle.
+	*
+	* @return the company ID of this bottle
+	*/
+	@Override
+	public long getCompanyId() {
+		return _bottle.getCompanyId();
+	}
+
+	/**
+	* Returns the group ID of this bottle.
+	*
+	* @return the group ID of this bottle
+	*/
+	@Override
+	public long getGroupId() {
+		return _bottle.getGroupId();
+	}
+
+	/**
+	* Returns the primary key of this bottle.
+	*
+	* @return the primary key of this bottle
+	*/
+	@Override
+	public long getPrimaryKey() {
+		return _bottle.getPrimaryKey();
+	}
+
+	/**
+	* Returns the rack ID of this bottle.
+	*
+	* @return the rack ID of this bottle
+	*/
+	@Override
+	public long getRackId() {
+		return _bottle.getRackId();
+	}
+
+	/**
+	* Returns the user ID of this bottle.
+	*
+	* @return the user ID of this bottle
+	*/
+	@Override
+	public long getUserId() {
+		return _bottle.getUserId();
+	}
+
+	@Override
+	public void persist() {
+		_bottle.persist();
+	}
+
+	/**
+	* Sets the bottle ID of this bottle.
+	*
+	* @param bottleId the bottle ID of this bottle
+	*/
+	@Override
+	public void setBottleId(long bottleId) {
+		_bottle.setBottleId(bottleId);
+	}
+
+	@Override
+	public void setCachedModel(boolean cachedModel) {
+		_bottle.setCachedModel(cachedModel);
+	}
+
+	/**
+	* Sets the company ID of this bottle.
+	*
+	* @param companyId the company ID of this bottle
+	*/
+	@Override
+	public void setCompanyId(long companyId) {
+		_bottle.setCompanyId(companyId);
+	}
+
+	/**
+	* Sets the create date of this bottle.
+	*
+	* @param createDate the create date of this bottle
+	*/
+	@Override
+	public void setCreateDate(Date createDate) {
+		_bottle.setCreateDate(createDate);
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(ExpandoBridge expandoBridge) {
+		_bottle.setExpandoBridgeAttributes(expandoBridge);
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(
+		com.liferay.portal.kernel.model.BaseModel<?> baseModel) {
+		_bottle.setExpandoBridgeAttributes(baseModel);
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(ServiceContext serviceContext) {
+		_bottle.setExpandoBridgeAttributes(serviceContext);
+	}
+
+	/**
+	* Sets whether this bottle is flipped.
+	*
+	* @param flipped the flipped of this bottle
+	*/
+	@Override
+	public void setFlipped(boolean flipped) {
+		_bottle.setFlipped(flipped);
+	}
+
+	/**
+	* Sets the group ID of this bottle.
+	*
+	* @param groupId the group ID of this bottle
+	*/
+	@Override
+	public void setGroupId(long groupId) {
+		_bottle.setGroupId(groupId);
+	}
+
+	/**
+	* Sets the modified date of this bottle.
+	*
+	* @param modifiedDate the modified date of this bottle
+	*/
+	@Override
+	public void setModifiedDate(Date modifiedDate) {
+		_bottle.setModifiedDate(modifiedDate);
+	}
+
+	/**
+	* Sets the name of this bottle.
+	*
+	* @param name the name of this bottle
+	*/
+	@Override
+	public void setName(java.lang.String name) {
+		_bottle.setName(name);
+	}
+
+	@Override
+	public void setNew(boolean n) {
+		_bottle.setNew(n);
+	}
+
+	/**
+	* Sets the primary key of this bottle.
+	*
+	* @param primaryKey the primary key of this bottle
+	*/
+	@Override
+	public void setPrimaryKey(long primaryKey) {
+		_bottle.setPrimaryKey(primaryKey);
+	}
+
+	@Override
+	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
+		_bottle.setPrimaryKeyObj(primaryKeyObj);
+	}
+
+	/**
+	* Sets the rack ID of this bottle.
+	*
+	* @param rackId the rack ID of this bottle
+	*/
+	@Override
+	public void setRackId(long rackId) {
+		_bottle.setRackId(rackId);
+	}
+
+	/**
+	* Sets the type of this bottle.
+	*
+	* @param type the type of this bottle
+	*/
+	@Override
+	public void setType(java.lang.String type) {
+		_bottle.setType(type);
+	}
+
+	/**
+	* Sets the user ID of this bottle.
+	*
+	* @param userId the user ID of this bottle
+	*/
+	@Override
+	public void setUserId(long userId) {
+		_bottle.setUserId(userId);
+	}
+
+	/**
+	* Sets the user name of this bottle.
+	*
+	* @param userName the user name of this bottle
+	*/
+	@Override
+	public void setUserName(java.lang.String userName) {
+		_bottle.setUserName(userName);
+	}
+
+	/**
+	* Sets the user uuid of this bottle.
+	*
+	* @param userUuid the user uuid of this bottle
+	*/
+	@Override
+	public void setUserUuid(java.lang.String userUuid) {
+		_bottle.setUserUuid(userUuid);
+	}
+
+	/**
+	* Sets the uuid of this bottle.
+	*
+	* @param uuid the uuid of this bottle
+	*/
+	@Override
+	public void setUuid(java.lang.String uuid) {
+		_bottle.setUuid(uuid);
+	}
+
+	/**
+	* Sets the xcolumn of this bottle.
+	*
+	* @param xcolumn the xcolumn of this bottle
+	*/
+	@Override
+	public void setXcolumn(int xcolumn) {
+		_bottle.setXcolumn(xcolumn);
+	}
+
+	/**
+	* Sets the yrow of this bottle.
+	*
+	* @param yrow the yrow of this bottle
+	*/
+	@Override
+	public void setYrow(int yrow) {
+		_bottle.setYrow(yrow);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof BottleWrapper)) {
+			return false;
+		}
+
+		BottleWrapper bottleWrapper = (BottleWrapper)obj;
+
+		if (Objects.equals(_bottle, bottleWrapper._bottle)) {
+			return true;
+		}
+
+		return false;
+	}
+
+	@Override
+	public StagedModelType getStagedModelType() {
+		return _bottle.getStagedModelType();
+	}
+
+	@Override
+	public Bottle getWrappedModel() {
+		return _bottle;
+	}
+
+	@Override
+	public boolean isEntityCacheEnabled() {
+		return _bottle.isEntityCacheEnabled();
+	}
+
+	@Override
+	public boolean isFinderCacheEnabled() {
+		return _bottle.isFinderCacheEnabled();
+	}
+
+	@Override
+	public void resetOriginalValues() {
+		_bottle.resetOriginalValues();
+	}
+
+	private final Bottle _bottle;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/Rack.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/Rack.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9c6a1962efd5cff3051d4b918abd25c1a7225e8
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/Rack.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.annotation.ImplementationClassName;
+import com.liferay.portal.kernel.model.PersistedModel;
+import com.liferay.portal.kernel.util.Accessor;
+
+/**
+ * The extended model interface for the Rack service. Represents a row in the &quot;embercellar_Rack&quot; database table, with each column mapped to a property of this class.
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackModel
+ * @see fr.ippon.services.embercellar.model.impl.RackImpl
+ * @see fr.ippon.services.embercellar.model.impl.RackModelImpl
+ * @generated
+ */
+@ImplementationClassName("fr.ippon.services.embercellar.model.impl.RackImpl")
+@ProviderType
+public interface Rack extends RackModel, PersistedModel {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this interface directly. Add methods to {@link fr.ippon.services.embercellar.model.impl.RackImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
+	 */
+	public static final Accessor<Rack, Long> RACK_ID_ACCESSOR = new Accessor<Rack, Long>() {
+			@Override
+			public Long get(Rack rack) {
+				return rack.getRackId();
+			}
+
+			@Override
+			public Class<Long> getAttributeClass() {
+				return Long.class;
+			}
+
+			@Override
+			public Class<Rack> getTypeClass() {
+				return Rack.class;
+			}
+		};
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackModel.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..38ed0e6a40ade7c5c23ceded170252d503cf5563
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackModel.java
@@ -0,0 +1,357 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.expando.kernel.model.ExpandoBridge;
+
+import com.liferay.portal.kernel.bean.AutoEscape;
+import com.liferay.portal.kernel.model.BaseModel;
+import com.liferay.portal.kernel.model.CacheModel;
+import com.liferay.portal.kernel.model.GroupedModel;
+import com.liferay.portal.kernel.model.ShardedModel;
+import com.liferay.portal.kernel.model.StagedAuditedModel;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import java.io.Serializable;
+
+import java.util.Date;
+
+/**
+ * The base model interface for the Rack service. Represents a row in the &quot;embercellar_Rack&quot; database table, with each column mapped to a property of this class.
+ *
+ * <p>
+ * This interface and its corresponding implementation {@link fr.ippon.services.embercellar.model.impl.RackModelImpl} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link fr.ippon.services.embercellar.model.impl.RackImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see Rack
+ * @see fr.ippon.services.embercellar.model.impl.RackImpl
+ * @see fr.ippon.services.embercellar.model.impl.RackModelImpl
+ * @generated
+ */
+@ProviderType
+public interface RackModel extends BaseModel<Rack>, GroupedModel, ShardedModel,
+	StagedAuditedModel {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. All methods that expect a rack model instance should use the {@link Rack} interface instead.
+	 */
+
+	/**
+	 * Returns the primary key of this rack.
+	 *
+	 * @return the primary key of this rack
+	 */
+	public long getPrimaryKey();
+
+	/**
+	 * Sets the primary key of this rack.
+	 *
+	 * @param primaryKey the primary key of this rack
+	 */
+	public void setPrimaryKey(long primaryKey);
+
+	/**
+	 * Returns the uuid of this rack.
+	 *
+	 * @return the uuid of this rack
+	 */
+	@AutoEscape
+	@Override
+	public String getUuid();
+
+	/**
+	 * Sets the uuid of this rack.
+	 *
+	 * @param uuid the uuid of this rack
+	 */
+	@Override
+	public void setUuid(String uuid);
+
+	/**
+	 * Returns the rack ID of this rack.
+	 *
+	 * @return the rack ID of this rack
+	 */
+	public long getRackId();
+
+	/**
+	 * Sets the rack ID of this rack.
+	 *
+	 * @param rackId the rack ID of this rack
+	 */
+	public void setRackId(long rackId);
+
+	/**
+	 * Returns the group ID of this rack.
+	 *
+	 * @return the group ID of this rack
+	 */
+	@Override
+	public long getGroupId();
+
+	/**
+	 * Sets the group ID of this rack.
+	 *
+	 * @param groupId the group ID of this rack
+	 */
+	@Override
+	public void setGroupId(long groupId);
+
+	/**
+	 * Returns the company ID of this rack.
+	 *
+	 * @return the company ID of this rack
+	 */
+	@Override
+	public long getCompanyId();
+
+	/**
+	 * Sets the company ID of this rack.
+	 *
+	 * @param companyId the company ID of this rack
+	 */
+	@Override
+	public void setCompanyId(long companyId);
+
+	/**
+	 * Returns the user ID of this rack.
+	 *
+	 * @return the user ID of this rack
+	 */
+	@Override
+	public long getUserId();
+
+	/**
+	 * Sets the user ID of this rack.
+	 *
+	 * @param userId the user ID of this rack
+	 */
+	@Override
+	public void setUserId(long userId);
+
+	/**
+	 * Returns the user uuid of this rack.
+	 *
+	 * @return the user uuid of this rack
+	 */
+	@Override
+	public String getUserUuid();
+
+	/**
+	 * Sets the user uuid of this rack.
+	 *
+	 * @param userUuid the user uuid of this rack
+	 */
+	@Override
+	public void setUserUuid(String userUuid);
+
+	/**
+	 * Returns the user name of this rack.
+	 *
+	 * @return the user name of this rack
+	 */
+	@AutoEscape
+	@Override
+	public String getUserName();
+
+	/**
+	 * Sets the user name of this rack.
+	 *
+	 * @param userName the user name of this rack
+	 */
+	@Override
+	public void setUserName(String userName);
+
+	/**
+	 * Returns the create date of this rack.
+	 *
+	 * @return the create date of this rack
+	 */
+	@Override
+	public Date getCreateDate();
+
+	/**
+	 * Sets the create date of this rack.
+	 *
+	 * @param createDate the create date of this rack
+	 */
+	@Override
+	public void setCreateDate(Date createDate);
+
+	/**
+	 * Returns the modified date of this rack.
+	 *
+	 * @return the modified date of this rack
+	 */
+	@Override
+	public Date getModifiedDate();
+
+	/**
+	 * Sets the modified date of this rack.
+	 *
+	 * @param modifiedDate the modified date of this rack
+	 */
+	@Override
+	public void setModifiedDate(Date modifiedDate);
+
+	/**
+	 * Returns the type of this rack.
+	 *
+	 * @return the type of this rack
+	 */
+	@AutoEscape
+	public String getType();
+
+	/**
+	 * Sets the type of this rack.
+	 *
+	 * @param type the type of this rack
+	 */
+	public void setType(String type);
+
+	/**
+	 * Returns the name of this rack.
+	 *
+	 * @return the name of this rack
+	 */
+	@AutoEscape
+	public String getName();
+
+	/**
+	 * Sets the name of this rack.
+	 *
+	 * @param name the name of this rack
+	 */
+	public void setName(String name);
+
+	/**
+	 * Returns the nb columns of this rack.
+	 *
+	 * @return the nb columns of this rack
+	 */
+	public int getNbColumns();
+
+	/**
+	 * Sets the nb columns of this rack.
+	 *
+	 * @param nbColumns the nb columns of this rack
+	 */
+	public void setNbColumns(int nbColumns);
+
+	/**
+	 * Returns the nb rows of this rack.
+	 *
+	 * @return the nb rows of this rack
+	 */
+	public int getNbRows();
+
+	/**
+	 * Sets the nb rows of this rack.
+	 *
+	 * @param nbRows the nb rows of this rack
+	 */
+	public void setNbRows(int nbRows);
+
+	/**
+	 * Returns the image of this rack.
+	 *
+	 * @return the image of this rack
+	 */
+	@AutoEscape
+	public String getImage();
+
+	/**
+	 * Sets the image of this rack.
+	 *
+	 * @param image the image of this rack
+	 */
+	public void setImage(String image);
+
+	/**
+	 * Returns the bottles ID of this rack.
+	 *
+	 * @return the bottles ID of this rack
+	 */
+	@AutoEscape
+	public String getBottlesId();
+
+	/**
+	 * Sets the bottles ID of this rack.
+	 *
+	 * @param bottlesId the bottles ID of this rack
+	 */
+	public void setBottlesId(String bottlesId);
+
+	@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(fr.ippon.services.embercellar.model.Rack rack);
+
+	@Override
+	public int hashCode();
+
+	@Override
+	public CacheModel<fr.ippon.services.embercellar.model.Rack> toCacheModel();
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack toEscapedModel();
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack toUnescapedModel();
+
+	@Override
+	public String toString();
+
+	@Override
+	public String toXmlString();
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackSoap.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackSoap.java
new file mode 100644
index 0000000000000000000000000000000000000000..f3b75c50f10dddfa591a4e0242dfd7d648c04e2f
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackSoap.java
@@ -0,0 +1,229 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+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 fr.ippon.services.embercellar.service.http.RackServiceSoap}.
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.http.RackServiceSoap
+ * @generated
+ */
+@ProviderType
+public class RackSoap implements Serializable {
+	public static RackSoap toSoapModel(Rack model) {
+		RackSoap soapModel = new RackSoap();
+
+		soapModel.setUuid(model.getUuid());
+		soapModel.setRackId(model.getRackId());
+		soapModel.setGroupId(model.getGroupId());
+		soapModel.setCompanyId(model.getCompanyId());
+		soapModel.setUserId(model.getUserId());
+		soapModel.setUserName(model.getUserName());
+		soapModel.setCreateDate(model.getCreateDate());
+		soapModel.setModifiedDate(model.getModifiedDate());
+		soapModel.setType(model.getType());
+		soapModel.setName(model.getName());
+		soapModel.setNbColumns(model.getNbColumns());
+		soapModel.setNbRows(model.getNbRows());
+		soapModel.setImage(model.getImage());
+		soapModel.setBottlesId(model.getBottlesId());
+
+		return soapModel;
+	}
+
+	public static RackSoap[] toSoapModels(Rack[] models) {
+		RackSoap[] soapModels = new RackSoap[models.length];
+
+		for (int i = 0; i < models.length; i++) {
+			soapModels[i] = toSoapModel(models[i]);
+		}
+
+		return soapModels;
+	}
+
+	public static RackSoap[][] toSoapModels(Rack[][] models) {
+		RackSoap[][] soapModels = null;
+
+		if (models.length > 0) {
+			soapModels = new RackSoap[models.length][models[0].length];
+		}
+		else {
+			soapModels = new RackSoap[0][0];
+		}
+
+		for (int i = 0; i < models.length; i++) {
+			soapModels[i] = toSoapModels(models[i]);
+		}
+
+		return soapModels;
+	}
+
+	public static RackSoap[] toSoapModels(List<Rack> models) {
+		List<RackSoap> soapModels = new ArrayList<RackSoap>(models.size());
+
+		for (Rack model : models) {
+			soapModels.add(toSoapModel(model));
+		}
+
+		return soapModels.toArray(new RackSoap[soapModels.size()]);
+	}
+
+	public RackSoap() {
+	}
+
+	public long getPrimaryKey() {
+		return _rackId;
+	}
+
+	public void setPrimaryKey(long pk) {
+		setRackId(pk);
+	}
+
+	public String getUuid() {
+		return _uuid;
+	}
+
+	public void setUuid(String uuid) {
+		_uuid = uuid;
+	}
+
+	public long getRackId() {
+		return _rackId;
+	}
+
+	public void setRackId(long rackId) {
+		_rackId = rackId;
+	}
+
+	public long getGroupId() {
+		return _groupId;
+	}
+
+	public void setGroupId(long groupId) {
+		_groupId = groupId;
+	}
+
+	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 String getType() {
+		return _type;
+	}
+
+	public void setType(String type) {
+		_type = type;
+	}
+
+	public String getName() {
+		return _name;
+	}
+
+	public void setName(String name) {
+		_name = name;
+	}
+
+	public int getNbColumns() {
+		return _nbColumns;
+	}
+
+	public void setNbColumns(int nbColumns) {
+		_nbColumns = nbColumns;
+	}
+
+	public int getNbRows() {
+		return _nbRows;
+	}
+
+	public void setNbRows(int nbRows) {
+		_nbRows = nbRows;
+	}
+
+	public String getImage() {
+		return _image;
+	}
+
+	public void setImage(String image) {
+		_image = image;
+	}
+
+	public String getBottlesId() {
+		return _bottlesId;
+	}
+
+	public void setBottlesId(String bottlesId) {
+		_bottlesId = bottlesId;
+	}
+
+	private String _uuid;
+	private long _rackId;
+	private long _groupId;
+	private long _companyId;
+	private long _userId;
+	private String _userName;
+	private Date _createDate;
+	private Date _modifiedDate;
+	private String _type;
+	private String _name;
+	private int _nbColumns;
+	private int _nbRows;
+	private String _image;
+	private String _bottlesId;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackWrapper.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..95ece8969b6e0248cc5ec3a41c9cb5af0d4321c7
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/model/RackWrapper.java
@@ -0,0 +1,633 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.expando.kernel.model.ExpandoBridge;
+
+import com.liferay.exportimport.kernel.lar.StagedModelType;
+
+import com.liferay.portal.kernel.model.ModelWrapper;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * This class is a wrapper for {@link Rack}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see Rack
+ * @generated
+ */
+@ProviderType
+public class RackWrapper implements Rack, ModelWrapper<Rack> {
+	public RackWrapper(Rack rack) {
+		_rack = rack;
+	}
+
+	@Override
+	public Class<?> getModelClass() {
+		return Rack.class;
+	}
+
+	@Override
+	public String getModelClassName() {
+		return Rack.class.getName();
+	}
+
+	@Override
+	public Map<String, Object> getModelAttributes() {
+		Map<String, Object> attributes = new HashMap<String, Object>();
+
+		attributes.put("uuid", getUuid());
+		attributes.put("rackId", getRackId());
+		attributes.put("groupId", getGroupId());
+		attributes.put("companyId", getCompanyId());
+		attributes.put("userId", getUserId());
+		attributes.put("userName", getUserName());
+		attributes.put("createDate", getCreateDate());
+		attributes.put("modifiedDate", getModifiedDate());
+		attributes.put("type", getType());
+		attributes.put("name", getName());
+		attributes.put("nbColumns", getNbColumns());
+		attributes.put("nbRows", getNbRows());
+		attributes.put("image", getImage());
+		attributes.put("bottlesId", getBottlesId());
+
+		return attributes;
+	}
+
+	@Override
+	public void setModelAttributes(Map<String, Object> attributes) {
+		String uuid = (String)attributes.get("uuid");
+
+		if (uuid != null) {
+			setUuid(uuid);
+		}
+
+		Long rackId = (Long)attributes.get("rackId");
+
+		if (rackId != null) {
+			setRackId(rackId);
+		}
+
+		Long groupId = (Long)attributes.get("groupId");
+
+		if (groupId != null) {
+			setGroupId(groupId);
+		}
+
+		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);
+		}
+
+		String type = (String)attributes.get("type");
+
+		if (type != null) {
+			setType(type);
+		}
+
+		String name = (String)attributes.get("name");
+
+		if (name != null) {
+			setName(name);
+		}
+
+		Integer nbColumns = (Integer)attributes.get("nbColumns");
+
+		if (nbColumns != null) {
+			setNbColumns(nbColumns);
+		}
+
+		Integer nbRows = (Integer)attributes.get("nbRows");
+
+		if (nbRows != null) {
+			setNbRows(nbRows);
+		}
+
+		String image = (String)attributes.get("image");
+
+		if (image != null) {
+			setImage(image);
+		}
+
+		String bottlesId = (String)attributes.get("bottlesId");
+
+		if (bottlesId != null) {
+			setBottlesId(bottlesId);
+		}
+	}
+
+	@Override
+	public boolean isCachedModel() {
+		return _rack.isCachedModel();
+	}
+
+	@Override
+	public boolean isEscapedModel() {
+		return _rack.isEscapedModel();
+	}
+
+	@Override
+	public boolean isNew() {
+		return _rack.isNew();
+	}
+
+	@Override
+	public ExpandoBridge getExpandoBridge() {
+		return _rack.getExpandoBridge();
+	}
+
+	@Override
+	public com.liferay.portal.kernel.model.CacheModel<fr.ippon.services.embercellar.model.Rack> toCacheModel() {
+		return _rack.toCacheModel();
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack toEscapedModel() {
+		return new RackWrapper(_rack.toEscapedModel());
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack toUnescapedModel() {
+		return new RackWrapper(_rack.toUnescapedModel());
+	}
+
+	@Override
+	public int compareTo(fr.ippon.services.embercellar.model.Rack rack) {
+		return _rack.compareTo(rack);
+	}
+
+	/**
+	* Returns the nb columns of this rack.
+	*
+	* @return the nb columns of this rack
+	*/
+	@Override
+	public int getNbColumns() {
+		return _rack.getNbColumns();
+	}
+
+	/**
+	* Returns the nb rows of this rack.
+	*
+	* @return the nb rows of this rack
+	*/
+	@Override
+	public int getNbRows() {
+		return _rack.getNbRows();
+	}
+
+	@Override
+	public int hashCode() {
+		return _rack.hashCode();
+	}
+
+	@Override
+	public Serializable getPrimaryKeyObj() {
+		return _rack.getPrimaryKeyObj();
+	}
+
+	@Override
+	public java.lang.Object clone() {
+		return new RackWrapper((Rack)_rack.clone());
+	}
+
+	/**
+	* Returns the bottles ID of this rack.
+	*
+	* @return the bottles ID of this rack
+	*/
+	@Override
+	public java.lang.String getBottlesId() {
+		return _rack.getBottlesId();
+	}
+
+	/**
+	* Returns the image of this rack.
+	*
+	* @return the image of this rack
+	*/
+	@Override
+	public java.lang.String getImage() {
+		return _rack.getImage();
+	}
+
+	/**
+	* Returns the name of this rack.
+	*
+	* @return the name of this rack
+	*/
+	@Override
+	public java.lang.String getName() {
+		return _rack.getName();
+	}
+
+	/**
+	* Returns the type of this rack.
+	*
+	* @return the type of this rack
+	*/
+	@Override
+	public java.lang.String getType() {
+		return _rack.getType();
+	}
+
+	/**
+	* Returns the user name of this rack.
+	*
+	* @return the user name of this rack
+	*/
+	@Override
+	public java.lang.String getUserName() {
+		return _rack.getUserName();
+	}
+
+	/**
+	* Returns the user uuid of this rack.
+	*
+	* @return the user uuid of this rack
+	*/
+	@Override
+	public java.lang.String getUserUuid() {
+		return _rack.getUserUuid();
+	}
+
+	/**
+	* Returns the uuid of this rack.
+	*
+	* @return the uuid of this rack
+	*/
+	@Override
+	public java.lang.String getUuid() {
+		return _rack.getUuid();
+	}
+
+	@Override
+	public java.lang.String toString() {
+		return _rack.toString();
+	}
+
+	@Override
+	public java.lang.String toXmlString() {
+		return _rack.toXmlString();
+	}
+
+	/**
+	* Returns the create date of this rack.
+	*
+	* @return the create date of this rack
+	*/
+	@Override
+	public Date getCreateDate() {
+		return _rack.getCreateDate();
+	}
+
+	/**
+	* Returns the modified date of this rack.
+	*
+	* @return the modified date of this rack
+	*/
+	@Override
+	public Date getModifiedDate() {
+		return _rack.getModifiedDate();
+	}
+
+	/**
+	* Returns the company ID of this rack.
+	*
+	* @return the company ID of this rack
+	*/
+	@Override
+	public long getCompanyId() {
+		return _rack.getCompanyId();
+	}
+
+	/**
+	* Returns the group ID of this rack.
+	*
+	* @return the group ID of this rack
+	*/
+	@Override
+	public long getGroupId() {
+		return _rack.getGroupId();
+	}
+
+	/**
+	* Returns the primary key of this rack.
+	*
+	* @return the primary key of this rack
+	*/
+	@Override
+	public long getPrimaryKey() {
+		return _rack.getPrimaryKey();
+	}
+
+	/**
+	* Returns the rack ID of this rack.
+	*
+	* @return the rack ID of this rack
+	*/
+	@Override
+	public long getRackId() {
+		return _rack.getRackId();
+	}
+
+	/**
+	* Returns the user ID of this rack.
+	*
+	* @return the user ID of this rack
+	*/
+	@Override
+	public long getUserId() {
+		return _rack.getUserId();
+	}
+
+	@Override
+	public void persist() {
+		_rack.persist();
+	}
+
+	/**
+	* Sets the bottles ID of this rack.
+	*
+	* @param bottlesId the bottles ID of this rack
+	*/
+	@Override
+	public void setBottlesId(java.lang.String bottlesId) {
+		_rack.setBottlesId(bottlesId);
+	}
+
+	@Override
+	public void setCachedModel(boolean cachedModel) {
+		_rack.setCachedModel(cachedModel);
+	}
+
+	/**
+	* Sets the company ID of this rack.
+	*
+	* @param companyId the company ID of this rack
+	*/
+	@Override
+	public void setCompanyId(long companyId) {
+		_rack.setCompanyId(companyId);
+	}
+
+	/**
+	* Sets the create date of this rack.
+	*
+	* @param createDate the create date of this rack
+	*/
+	@Override
+	public void setCreateDate(Date createDate) {
+		_rack.setCreateDate(createDate);
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(ExpandoBridge expandoBridge) {
+		_rack.setExpandoBridgeAttributes(expandoBridge);
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(
+		com.liferay.portal.kernel.model.BaseModel<?> baseModel) {
+		_rack.setExpandoBridgeAttributes(baseModel);
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(ServiceContext serviceContext) {
+		_rack.setExpandoBridgeAttributes(serviceContext);
+	}
+
+	/**
+	* Sets the group ID of this rack.
+	*
+	* @param groupId the group ID of this rack
+	*/
+	@Override
+	public void setGroupId(long groupId) {
+		_rack.setGroupId(groupId);
+	}
+
+	/**
+	* Sets the image of this rack.
+	*
+	* @param image the image of this rack
+	*/
+	@Override
+	public void setImage(java.lang.String image) {
+		_rack.setImage(image);
+	}
+
+	/**
+	* Sets the modified date of this rack.
+	*
+	* @param modifiedDate the modified date of this rack
+	*/
+	@Override
+	public void setModifiedDate(Date modifiedDate) {
+		_rack.setModifiedDate(modifiedDate);
+	}
+
+	/**
+	* Sets the name of this rack.
+	*
+	* @param name the name of this rack
+	*/
+	@Override
+	public void setName(java.lang.String name) {
+		_rack.setName(name);
+	}
+
+	/**
+	* Sets the nb columns of this rack.
+	*
+	* @param nbColumns the nb columns of this rack
+	*/
+	@Override
+	public void setNbColumns(int nbColumns) {
+		_rack.setNbColumns(nbColumns);
+	}
+
+	/**
+	* Sets the nb rows of this rack.
+	*
+	* @param nbRows the nb rows of this rack
+	*/
+	@Override
+	public void setNbRows(int nbRows) {
+		_rack.setNbRows(nbRows);
+	}
+
+	@Override
+	public void setNew(boolean n) {
+		_rack.setNew(n);
+	}
+
+	/**
+	* Sets the primary key of this rack.
+	*
+	* @param primaryKey the primary key of this rack
+	*/
+	@Override
+	public void setPrimaryKey(long primaryKey) {
+		_rack.setPrimaryKey(primaryKey);
+	}
+
+	@Override
+	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
+		_rack.setPrimaryKeyObj(primaryKeyObj);
+	}
+
+	/**
+	* Sets the rack ID of this rack.
+	*
+	* @param rackId the rack ID of this rack
+	*/
+	@Override
+	public void setRackId(long rackId) {
+		_rack.setRackId(rackId);
+	}
+
+	/**
+	* Sets the type of this rack.
+	*
+	* @param type the type of this rack
+	*/
+	@Override
+	public void setType(java.lang.String type) {
+		_rack.setType(type);
+	}
+
+	/**
+	* Sets the user ID of this rack.
+	*
+	* @param userId the user ID of this rack
+	*/
+	@Override
+	public void setUserId(long userId) {
+		_rack.setUserId(userId);
+	}
+
+	/**
+	* Sets the user name of this rack.
+	*
+	* @param userName the user name of this rack
+	*/
+	@Override
+	public void setUserName(java.lang.String userName) {
+		_rack.setUserName(userName);
+	}
+
+	/**
+	* Sets the user uuid of this rack.
+	*
+	* @param userUuid the user uuid of this rack
+	*/
+	@Override
+	public void setUserUuid(java.lang.String userUuid) {
+		_rack.setUserUuid(userUuid);
+	}
+
+	/**
+	* Sets the uuid of this rack.
+	*
+	* @param uuid the uuid of this rack
+	*/
+	@Override
+	public void setUuid(java.lang.String uuid) {
+		_rack.setUuid(uuid);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof RackWrapper)) {
+			return false;
+		}
+
+		RackWrapper rackWrapper = (RackWrapper)obj;
+
+		if (Objects.equals(_rack, rackWrapper._rack)) {
+			return true;
+		}
+
+		return false;
+	}
+
+	@Override
+	public StagedModelType getStagedModelType() {
+		return _rack.getStagedModelType();
+	}
+
+	@Override
+	public Rack getWrappedModel() {
+		return _rack;
+	}
+
+	@Override
+	public boolean isEntityCacheEnabled() {
+		return _rack.isEntityCacheEnabled();
+	}
+
+	@Override
+	public boolean isFinderCacheEnabled() {
+		return _rack.isFinderCacheEnabled();
+	}
+
+	@Override
+	public void resetOriginalValues() {
+		_rack.resetOriginalValues();
+	}
+
+	private final Rack _rack;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalService.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalService.java
new file mode 100644
index 0000000000000000000000000000000000000000..14adeaa2ccfa1eb370d44a128547df40eb0a53de
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalService.java
@@ -0,0 +1,297 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.exportimport.kernel.lar.PortletDataContext;
+
+import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.Projection;
+import com.liferay.portal.kernel.exception.NoSuchUserException;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.kernel.model.PersistedModel;
+import com.liferay.portal.kernel.search.Indexable;
+import com.liferay.portal.kernel.search.IndexableType;
+import com.liferay.portal.kernel.service.BaseLocalService;
+import com.liferay.portal.kernel.service.PersistedModelLocalService;
+import com.liferay.portal.kernel.service.ServiceContext;
+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.kernel.util.OrderByComparator;
+
+import fr.ippon.services.embercellar.model.Bottle;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+/**
+ * Provides the local service interface for Bottle. 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 Brian Wing Shun Chan
+ * @see BottleLocalServiceUtil
+ * @see fr.ippon.services.embercellar.service.base.BottleLocalServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl
+ * @generated
+ */
+@ProviderType
+@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
+	PortalException.class, SystemException.class})
+public interface BottleLocalService extends BaseLocalService,
+	PersistedModelLocalService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. Always use {@link BottleLocalServiceUtil} to access the bottle local service. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
+	 */
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public ActionableDynamicQuery getActionableDynamicQuery();
+
+	public DynamicQuery dynamicQuery();
+
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		PortletDataContext portletDataContext);
+
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public IndexableActionableDynamicQuery getIndexableActionableDynamicQuery();
+
+	/**
+	* @throws PortalException
+	*/
+	@Override
+	public PersistedModel deletePersistedModel(PersistedModel persistedModel)
+		throws PortalException;
+
+	@Override
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public PersistedModel getPersistedModel(Serializable primaryKeyObj)
+		throws PortalException;
+
+	/**
+	* Adds the bottle to the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was added
+	*/
+	@Indexable(type = IndexableType.REINDEX)
+	public Bottle addBottle(Bottle bottle);
+
+	public Bottle addBottle(long userId, long groupId, java.lang.String name,
+		int column, int row, boolean flipped, long rackId,
+		ServiceContext serviceContext) throws NoSuchUserException;
+
+	/**
+	* Creates a new bottle with the primary key. Does not add the bottle to the database.
+	*
+	* @param bottleId the primary key for the new bottle
+	* @return the new bottle
+	*/
+	public Bottle createBottle(long bottleId);
+
+	/**
+	* Deletes the bottle from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was removed
+	*/
+	@Indexable(type = IndexableType.DELETE)
+	public Bottle deleteBottle(Bottle bottle);
+
+	/**
+	* Deletes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle that was removed
+	* @throws PortalException if a bottle with the primary key could not be found
+	*/
+	@Indexable(type = IndexableType.DELETE)
+	public Bottle deleteBottle(long bottleId) throws PortalException;
+
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Bottle fetchBottle(long bottleId);
+
+	/**
+	* Returns the bottle matching the UUID and group.
+	*
+	* @param uuid the bottle's UUID
+	* @param groupId the primary key of the group
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Bottle fetchBottleByUuidAndGroupId(java.lang.String uuid,
+		long groupId);
+
+	/**
+	* Returns the bottle with the primary key.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle
+	* @throws PortalException if a bottle with the primary key could not be found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Bottle getBottle(long bottleId) throws PortalException;
+
+	/**
+	* Returns the bottle matching the UUID and group.
+	*
+	* @param uuid the bottle's UUID
+	* @param groupId the primary key of the group
+	* @return the matching bottle
+	* @throws PortalException if a matching bottle could not be found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Bottle getBottleByUuidAndGroupId(java.lang.String uuid, long groupId)
+		throws PortalException;
+
+	/**
+	* Updates the bottle in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was updated
+	*/
+	@Indexable(type = IndexableType.REINDEX)
+	public Bottle updateBottle(Bottle bottle);
+
+	/**
+	* Returns the number of bottles.
+	*
+	* @return the number of bottles
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public int getBottlesCount();
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public java.lang.String getOSGiServiceIdentifier();
+
+	/**
+	* Performs a dynamic query on the database and returns the matching rows.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the matching rows
+	*/
+	public <T> List<T> dynamicQuery(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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	*/
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int 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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	*/
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int end, OrderByComparator<T> orderByComparator);
+
+	public List<Bottle> findAll();
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleLocalServiceUtil} to access the bottle local service.
+	*/
+	public List<Bottle> findByRackId(long rackId);
+
+	/**
+	* Returns a range of all the bottles.
+	*
+	* <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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of bottles
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public List<Bottle> getBottles(int start, int end);
+
+	/**
+	* Returns all the bottles matching the UUID and company.
+	*
+	* @param uuid the UUID of the bottles
+	* @param companyId the primary key of the company
+	* @return the matching bottles, or an empty list if no matches were found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public List<Bottle> getBottlesByUuidAndCompanyId(java.lang.String uuid,
+		long companyId);
+
+	/**
+	* Returns a range of bottles matching the UUID and company.
+	*
+	* @param uuid the UUID of the bottles
+	* @param companyId the primary key of the company
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the range of matching bottles, or an empty list if no matches were found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public List<Bottle> getBottlesByUuidAndCompanyId(java.lang.String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the number of rows matching the dynamic query
+	*/
+	public long dynamicQueryCount(DynamicQuery dynamicQuery);
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @param projection the projection to apply to the query
+	* @return the number of rows matching the dynamic query
+	*/
+	public long dynamicQueryCount(DynamicQuery dynamicQuery,
+		Projection projection);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalServiceUtil.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalServiceUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..f78dcd71e77394f90aede4b736be1d025592e27e
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalServiceUtil.java
@@ -0,0 +1,345 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.osgi.util.ServiceTrackerFactory;
+
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Provides the local service utility for Bottle. This utility wraps
+ * {@link fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl} 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 Brian Wing Shun Chan
+ * @see BottleLocalService
+ * @see fr.ippon.services.embercellar.service.base.BottleLocalServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl
+ * @generated
+ */
+@ProviderType
+public class BottleLocalServiceUtil {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this class directly. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl} and rerun ServiceBuilder to regenerate this class.
+	 */
+	public static com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery getActionableDynamicQuery() {
+		return getService().getActionableDynamicQuery();
+	}
+
+	public static com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
+		return getService().dynamicQuery();
+	}
+
+	public static com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		com.liferay.exportimport.kernel.lar.PortletDataContext portletDataContext) {
+		return getService().getExportActionableDynamicQuery(portletDataContext);
+	}
+
+	public static com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() {
+		return getService().getIndexableActionableDynamicQuery();
+	}
+
+	/**
+	* @throws PortalException
+	*/
+	public static com.liferay.portal.kernel.model.PersistedModel deletePersistedModel(
+		com.liferay.portal.kernel.model.PersistedModel persistedModel)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().deletePersistedModel(persistedModel);
+	}
+
+	public static com.liferay.portal.kernel.model.PersistedModel getPersistedModel(
+		java.io.Serializable primaryKeyObj)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().getPersistedModel(primaryKeyObj);
+	}
+
+	/**
+	* Adds the bottle to the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was added
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle addBottle(
+		fr.ippon.services.embercellar.model.Bottle bottle) {
+		return getService().addBottle(bottle);
+	}
+
+	public static fr.ippon.services.embercellar.model.Bottle addBottle(
+		long userId, long groupId, java.lang.String name, int column, int row,
+		boolean flipped, long rackId,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		return getService()
+				   .addBottle(userId, groupId, name, column, row, flipped,
+			rackId, serviceContext);
+	}
+
+	/**
+	* Creates a new bottle with the primary key. Does not add the bottle to the database.
+	*
+	* @param bottleId the primary key for the new bottle
+	* @return the new bottle
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle createBottle(
+		long bottleId) {
+		return getService().createBottle(bottleId);
+	}
+
+	/**
+	* Deletes the bottle from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was removed
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle deleteBottle(
+		fr.ippon.services.embercellar.model.Bottle bottle) {
+		return getService().deleteBottle(bottle);
+	}
+
+	/**
+	* Deletes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle that was removed
+	* @throws PortalException if a bottle with the primary key could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle deleteBottle(
+		long bottleId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().deleteBottle(bottleId);
+	}
+
+	public static fr.ippon.services.embercellar.model.Bottle fetchBottle(
+		long bottleId) {
+		return getService().fetchBottle(bottleId);
+	}
+
+	/**
+	* Returns the bottle matching the UUID and group.
+	*
+	* @param uuid the bottle's UUID
+	* @param groupId the primary key of the group
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle fetchBottleByUuidAndGroupId(
+		java.lang.String uuid, long groupId) {
+		return getService().fetchBottleByUuidAndGroupId(uuid, groupId);
+	}
+
+	/**
+	* Returns the bottle with the primary key.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle
+	* @throws PortalException if a bottle with the primary key could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle getBottle(
+		long bottleId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().getBottle(bottleId);
+	}
+
+	/**
+	* Returns the bottle matching the UUID and group.
+	*
+	* @param uuid the bottle's UUID
+	* @param groupId the primary key of the group
+	* @return the matching bottle
+	* @throws PortalException if a matching bottle could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle getBottleByUuidAndGroupId(
+		java.lang.String uuid, long groupId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().getBottleByUuidAndGroupId(uuid, groupId);
+	}
+
+	/**
+	* Updates the bottle in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was updated
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle updateBottle(
+		fr.ippon.services.embercellar.model.Bottle bottle) {
+		return getService().updateBottle(bottle);
+	}
+
+	/**
+	* Returns the number of bottles.
+	*
+	* @return the number of bottles
+	*/
+	public static int getBottlesCount() {
+		return getService().getBottlesCount();
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public static java.lang.String getOSGiServiceIdentifier() {
+		return getService().getOSGiServiceIdentifier();
+	}
+
+	/**
+	* Performs a dynamic query on the database and returns the matching rows.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the matching rows
+	*/
+	public static <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	*/
+	public static <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end) {
+		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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	*/
+	public static <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<T> orderByComparator) {
+		return getService()
+				   .dynamicQuery(dynamicQuery, start, end, orderByComparator);
+	}
+
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> findAll() {
+		return getService().findAll();
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleLocalServiceUtil} to access the bottle local service.
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> findByRackId(
+		long rackId) {
+		return getService().findByRackId(rackId);
+	}
+
+	/**
+	* Returns a range of all the bottles.
+	*
+	* <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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of bottles
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> getBottles(
+		int start, int end) {
+		return getService().getBottles(start, end);
+	}
+
+	/**
+	* Returns all the bottles matching the UUID and company.
+	*
+	* @param uuid the UUID of the bottles
+	* @param companyId the primary key of the company
+	* @return the matching bottles, or an empty list if no matches were found
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> getBottlesByUuidAndCompanyId(
+		java.lang.String uuid, long companyId) {
+		return getService().getBottlesByUuidAndCompanyId(uuid, companyId);
+	}
+
+	/**
+	* Returns a range of bottles matching the UUID and company.
+	*
+	* @param uuid the UUID of the bottles
+	* @param companyId the primary key of the company
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the range of matching bottles, or an empty list if no matches were found
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> getBottlesByUuidAndCompanyId(
+		java.lang.String uuid, long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<fr.ippon.services.embercellar.model.Bottle> orderByComparator) {
+		return getService()
+				   .getBottlesByUuidAndCompanyId(uuid, companyId, start, end,
+			orderByComparator);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the number of rows matching the dynamic query
+	*/
+	public static long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		return getService().dynamicQueryCount(dynamicQuery);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @param projection the projection to apply to the query
+	* @return the number of rows matching the dynamic query
+	*/
+	public static long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
+		com.liferay.portal.kernel.dao.orm.Projection projection) {
+		return getService().dynamicQueryCount(dynamicQuery, projection);
+	}
+
+	public static BottleLocalService getService() {
+		return _serviceTracker.getService();
+	}
+
+	private static ServiceTracker<BottleLocalService, BottleLocalService> _serviceTracker =
+		ServiceTrackerFactory.open(BottleLocalService.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalServiceWrapper.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalServiceWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..d586c7be63e2bd5a7e602f278bbdeb088cfef1ca
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleLocalServiceWrapper.java
@@ -0,0 +1,365 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.service.ServiceWrapper;
+
+/**
+ * Provides a wrapper for {@link BottleLocalService}.
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleLocalService
+ * @generated
+ */
+@ProviderType
+public class BottleLocalServiceWrapper implements BottleLocalService,
+	ServiceWrapper<BottleLocalService> {
+	public BottleLocalServiceWrapper(BottleLocalService bottleLocalService) {
+		_bottleLocalService = bottleLocalService;
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery getActionableDynamicQuery() {
+		return _bottleLocalService.getActionableDynamicQuery();
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
+		return _bottleLocalService.dynamicQuery();
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		com.liferay.exportimport.kernel.lar.PortletDataContext portletDataContext) {
+		return _bottleLocalService.getExportActionableDynamicQuery(portletDataContext);
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() {
+		return _bottleLocalService.getIndexableActionableDynamicQuery();
+	}
+
+	/**
+	* @throws PortalException
+	*/
+	@Override
+	public com.liferay.portal.kernel.model.PersistedModel deletePersistedModel(
+		com.liferay.portal.kernel.model.PersistedModel persistedModel)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _bottleLocalService.deletePersistedModel(persistedModel);
+	}
+
+	@Override
+	public com.liferay.portal.kernel.model.PersistedModel getPersistedModel(
+		java.io.Serializable primaryKeyObj)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _bottleLocalService.getPersistedModel(primaryKeyObj);
+	}
+
+	/**
+	* Adds the bottle to the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was added
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle addBottle(
+		fr.ippon.services.embercellar.model.Bottle bottle) {
+		return _bottleLocalService.addBottle(bottle);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle addBottle(long userId,
+		long groupId, java.lang.String name, int column, int row,
+		boolean flipped, long rackId,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		return _bottleLocalService.addBottle(userId, groupId, name, column,
+			row, flipped, rackId, serviceContext);
+	}
+
+	/**
+	* Creates a new bottle with the primary key. Does not add the bottle to the database.
+	*
+	* @param bottleId the primary key for the new bottle
+	* @return the new bottle
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle createBottle(
+		long bottleId) {
+		return _bottleLocalService.createBottle(bottleId);
+	}
+
+	/**
+	* Deletes the bottle from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was removed
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle deleteBottle(
+		fr.ippon.services.embercellar.model.Bottle bottle) {
+		return _bottleLocalService.deleteBottle(bottle);
+	}
+
+	/**
+	* Deletes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle that was removed
+	* @throws PortalException if a bottle with the primary key could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle deleteBottle(
+		long bottleId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _bottleLocalService.deleteBottle(bottleId);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle fetchBottle(long bottleId) {
+		return _bottleLocalService.fetchBottle(bottleId);
+	}
+
+	/**
+	* Returns the bottle matching the UUID and group.
+	*
+	* @param uuid the bottle's UUID
+	* @param groupId the primary key of the group
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle fetchBottleByUuidAndGroupId(
+		java.lang.String uuid, long groupId) {
+		return _bottleLocalService.fetchBottleByUuidAndGroupId(uuid, groupId);
+	}
+
+	/**
+	* Returns the bottle with the primary key.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle
+	* @throws PortalException if a bottle with the primary key could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle getBottle(long bottleId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _bottleLocalService.getBottle(bottleId);
+	}
+
+	/**
+	* Returns the bottle matching the UUID and group.
+	*
+	* @param uuid the bottle's UUID
+	* @param groupId the primary key of the group
+	* @return the matching bottle
+	* @throws PortalException if a matching bottle could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle getBottleByUuidAndGroupId(
+		java.lang.String uuid, long groupId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _bottleLocalService.getBottleByUuidAndGroupId(uuid, groupId);
+	}
+
+	/**
+	* Updates the bottle in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	*
+	* @param bottle the bottle
+	* @return the bottle that was updated
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle updateBottle(
+		fr.ippon.services.embercellar.model.Bottle bottle) {
+		return _bottleLocalService.updateBottle(bottle);
+	}
+
+	/**
+	* Returns the number of bottles.
+	*
+	* @return the number of bottles
+	*/
+	@Override
+	public int getBottlesCount() {
+		return _bottleLocalService.getBottlesCount();
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	@Override
+	public java.lang.String getOSGiServiceIdentifier() {
+		return _bottleLocalService.getOSGiServiceIdentifier();
+	}
+
+	/**
+	* Performs a dynamic query on the database and returns the matching rows.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the matching rows
+	*/
+	@Override
+	public <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		return _bottleLocalService.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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	*/
+	@Override
+	public <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end) {
+		return _bottleLocalService.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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	*/
+	@Override
+	public <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<T> orderByComparator) {
+		return _bottleLocalService.dynamicQuery(dynamicQuery, start, end,
+			orderByComparator);
+	}
+
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> findAll() {
+		return _bottleLocalService.findAll();
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleLocalServiceUtil} to access the bottle local service.
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> findByRackId(
+		long rackId) {
+		return _bottleLocalService.findByRackId(rackId);
+	}
+
+	/**
+	* Returns a range of all the bottles.
+	*
+	* <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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of bottles
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> getBottles(
+		int start, int end) {
+		return _bottleLocalService.getBottles(start, end);
+	}
+
+	/**
+	* Returns all the bottles matching the UUID and company.
+	*
+	* @param uuid the UUID of the bottles
+	* @param companyId the primary key of the company
+	* @return the matching bottles, or an empty list if no matches were found
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> getBottlesByUuidAndCompanyId(
+		java.lang.String uuid, long companyId) {
+		return _bottleLocalService.getBottlesByUuidAndCompanyId(uuid, companyId);
+	}
+
+	/**
+	* Returns a range of bottles matching the UUID and company.
+	*
+	* @param uuid the UUID of the bottles
+	* @param companyId the primary key of the company
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the range of matching bottles, or an empty list if no matches were found
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> getBottlesByUuidAndCompanyId(
+		java.lang.String uuid, long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<fr.ippon.services.embercellar.model.Bottle> orderByComparator) {
+		return _bottleLocalService.getBottlesByUuidAndCompanyId(uuid,
+			companyId, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the number of rows matching the dynamic query
+	*/
+	@Override
+	public long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		return _bottleLocalService.dynamicQueryCount(dynamicQuery);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @param projection the projection to apply to the query
+	* @return the number of rows matching the dynamic query
+	*/
+	@Override
+	public long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
+		com.liferay.portal.kernel.dao.orm.Projection projection) {
+		return _bottleLocalService.dynamicQueryCount(dynamicQuery, projection);
+	}
+
+	@Override
+	public BottleLocalService getWrappedService() {
+		return _bottleLocalService;
+	}
+
+	@Override
+	public void setWrappedService(BottleLocalService bottleLocalService) {
+		_bottleLocalService = bottleLocalService;
+	}
+
+	private BottleLocalService _bottleLocalService;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleService.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8c779c4c6eb393dac627e6087a9c828f4f32e58
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleService.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.NoSuchUserException;
+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.security.access.control.AccessControlled;
+import com.liferay.portal.kernel.service.BaseService;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.spring.osgi.OSGiBeanProperties;
+import com.liferay.portal.kernel.transaction.Isolation;
+import com.liferay.portal.kernel.transaction.Transactional;
+
+import fr.ippon.services.embercellar.model.Bottle;
+
+import java.util.List;
+
+/**
+ * Provides the remote service interface for Bottle. Methods of this
+ * service are expected to have security checks based on the propagated JAAS
+ * credentials because this service can be accessed remotely.
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleServiceUtil
+ * @see fr.ippon.services.embercellar.service.base.BottleServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.BottleServiceImpl
+ * @generated
+ */
+@AccessControlled
+@JSONWebService
+@OSGiBeanProperties(property =  {
+	"json.web.service.context.name=embercellar", "json.web.service.context.path=Bottle"}, service = BottleService.class)
+@ProviderType
+@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
+	PortalException.class, SystemException.class})
+public interface BottleService extends BaseService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. Always use {@link BottleServiceUtil} to access the bottle remote service. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.BottleServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
+	 */
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleServiceUtil} to access the bottle remote service.
+	*/
+	public Bottle addBottle(java.lang.String name, int column, int row,
+		boolean flipped, long rackId, ServiceContext serviceContext)
+		throws NoSuchUserException;
+
+	public Bottle findByBottleId(long bottleId);
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public java.lang.String getOSGiServiceIdentifier();
+
+	public List<Bottle> findAll();
+
+	public List<Bottle> findByRackId(long rackId);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleServiceUtil.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleServiceUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..154b2837c55b19ed8e7379aab34fcaa57927a2ec
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleServiceUtil.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.osgi.util.ServiceTrackerFactory;
+
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Provides the remote service utility for Bottle. This utility wraps
+ * {@link fr.ippon.services.embercellar.service.impl.BottleServiceImpl} 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 Brian Wing Shun Chan
+ * @see BottleService
+ * @see fr.ippon.services.embercellar.service.base.BottleServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.BottleServiceImpl
+ * @generated
+ */
+@ProviderType
+public class BottleServiceUtil {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this class directly. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.BottleServiceImpl} and rerun ServiceBuilder to regenerate this class.
+	 */
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleServiceUtil} to access the bottle remote service.
+	*/
+	public static fr.ippon.services.embercellar.model.Bottle addBottle(
+		java.lang.String name, int column, int row, boolean flipped,
+		long rackId,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		return getService()
+				   .addBottle(name, column, row, flipped, rackId, serviceContext);
+	}
+
+	public static fr.ippon.services.embercellar.model.Bottle findByBottleId(
+		long bottleId) {
+		return getService().findByBottleId(bottleId);
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public static java.lang.String getOSGiServiceIdentifier() {
+		return getService().getOSGiServiceIdentifier();
+	}
+
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> findAll() {
+		return getService().findAll();
+	}
+
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> findByRackId(
+		long rackId) {
+		return getService().findByRackId(rackId);
+	}
+
+	public static BottleService getService() {
+		return _serviceTracker.getService();
+	}
+
+	private static ServiceTracker<BottleService, BottleService> _serviceTracker = ServiceTrackerFactory.open(BottleService.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleServiceWrapper.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleServiceWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..a412e7abf089bc795b9a7fdb44ba4939b31bd58d
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/BottleServiceWrapper.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.service.ServiceWrapper;
+
+/**
+ * Provides a wrapper for {@link BottleService}.
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleService
+ * @generated
+ */
+@ProviderType
+public class BottleServiceWrapper implements BottleService,
+	ServiceWrapper<BottleService> {
+	public BottleServiceWrapper(BottleService bottleService) {
+		_bottleService = bottleService;
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleServiceUtil} to access the bottle remote service.
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle addBottle(
+		java.lang.String name, int column, int row, boolean flipped,
+		long rackId,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		return _bottleService.addBottle(name, column, row, flipped, rackId,
+			serviceContext);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Bottle findByBottleId(
+		long bottleId) {
+		return _bottleService.findByBottleId(bottleId);
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	@Override
+	public java.lang.String getOSGiServiceIdentifier() {
+		return _bottleService.getOSGiServiceIdentifier();
+	}
+
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> findAll() {
+		return _bottleService.findAll();
+	}
+
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Bottle> findByRackId(
+		long rackId) {
+		return _bottleService.findByRackId(rackId);
+	}
+
+	@Override
+	public BottleService getWrappedService() {
+		return _bottleService;
+	}
+
+	@Override
+	public void setWrappedService(BottleService bottleService) {
+		_bottleService = bottleService;
+	}
+
+	private BottleService _bottleService;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalService.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8dd60df9fd731c021e601dc52468ede48793b09
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalService.java
@@ -0,0 +1,296 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.exportimport.kernel.lar.PortletDataContext;
+
+import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.Projection;
+import com.liferay.portal.kernel.exception.NoSuchUserException;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.kernel.model.PersistedModel;
+import com.liferay.portal.kernel.search.Indexable;
+import com.liferay.portal.kernel.search.IndexableType;
+import com.liferay.portal.kernel.service.BaseLocalService;
+import com.liferay.portal.kernel.service.PersistedModelLocalService;
+import com.liferay.portal.kernel.service.ServiceContext;
+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.kernel.util.OrderByComparator;
+
+import fr.ippon.services.embercellar.model.Rack;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+/**
+ * Provides the local service interface for Rack. 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 Brian Wing Shun Chan
+ * @see RackLocalServiceUtil
+ * @see fr.ippon.services.embercellar.service.base.RackLocalServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl
+ * @generated
+ */
+@ProviderType
+@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
+	PortalException.class, SystemException.class})
+public interface RackLocalService extends BaseLocalService,
+	PersistedModelLocalService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. Always use {@link RackLocalServiceUtil} to access the rack local service. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
+	 */
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public ActionableDynamicQuery getActionableDynamicQuery();
+
+	public DynamicQuery dynamicQuery();
+
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		PortletDataContext portletDataContext);
+
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public IndexableActionableDynamicQuery getIndexableActionableDynamicQuery();
+
+	/**
+	* @throws PortalException
+	*/
+	@Override
+	public PersistedModel deletePersistedModel(PersistedModel persistedModel)
+		throws PortalException;
+
+	@Override
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public PersistedModel getPersistedModel(Serializable primaryKeyObj)
+		throws PortalException;
+
+	/**
+	* Adds the rack to the database. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was added
+	*/
+	@Indexable(type = IndexableType.REINDEX)
+	public Rack addRack(Rack rack);
+
+	public Rack addRack(long userId, long groupId, java.lang.String name,
+		int nbColumns, int nbRows, java.lang.String pathImg,
+		ServiceContext serviceContext) throws NoSuchUserException;
+
+	/**
+	* Creates a new rack with the primary key. Does not add the rack to the database.
+	*
+	* @param rackId the primary key for the new rack
+	* @return the new rack
+	*/
+	public Rack createRack(long rackId);
+
+	/**
+	* Deletes the rack from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was removed
+	*/
+	@Indexable(type = IndexableType.DELETE)
+	public Rack deleteRack(Rack rack);
+
+	/**
+	* Deletes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack that was removed
+	* @throws PortalException if a rack with the primary key could not be found
+	*/
+	@Indexable(type = IndexableType.DELETE)
+	public Rack deleteRack(long rackId) throws PortalException;
+
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Rack fetchRack(long rackId);
+
+	/**
+	* Returns the rack matching the UUID and group.
+	*
+	* @param uuid the rack's UUID
+	* @param groupId the primary key of the group
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Rack fetchRackByUuidAndGroupId(java.lang.String uuid, long groupId);
+
+	public Rack findByRackId(long rackId);
+
+	/**
+	* Returns the rack with the primary key.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack
+	* @throws PortalException if a rack with the primary key could not be found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Rack getRack(long rackId) throws PortalException;
+
+	/**
+	* Returns the rack matching the UUID and group.
+	*
+	* @param uuid the rack's UUID
+	* @param groupId the primary key of the group
+	* @return the matching rack
+	* @throws PortalException if a matching rack could not be found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public Rack getRackByUuidAndGroupId(java.lang.String uuid, long groupId)
+		throws PortalException;
+
+	/**
+	* Updates the rack in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was updated
+	*/
+	@Indexable(type = IndexableType.REINDEX)
+	public Rack updateRack(Rack rack);
+
+	/**
+	* Returns the number of racks.
+	*
+	* @return the number of racks
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public int getRacksCount();
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public java.lang.String getOSGiServiceIdentifier();
+
+	/**
+	* Performs a dynamic query on the database and returns the matching rows.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the matching rows
+	*/
+	public <T> List<T> dynamicQuery(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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	*/
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int 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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	*/
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int end, OrderByComparator<T> orderByComparator);
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	* <p/>
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackLocalServiceUtil} to access the rack local service.
+	*/
+	public List<Rack> findAll();
+
+	/**
+	* Returns a range of all the racks.
+	*
+	* <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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of racks
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public List<Rack> getRacks(int start, int end);
+
+	/**
+	* Returns all the racks matching the UUID and company.
+	*
+	* @param uuid the UUID of the racks
+	* @param companyId the primary key of the company
+	* @return the matching racks, or an empty list if no matches were found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public List<Rack> getRacksByUuidAndCompanyId(java.lang.String uuid,
+		long companyId);
+
+	/**
+	* Returns a range of racks matching the UUID and company.
+	*
+	* @param uuid the UUID of the racks
+	* @param companyId the primary key of the company
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the range of matching racks, or an empty list if no matches were found
+	*/
+	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
+	public List<Rack> getRacksByUuidAndCompanyId(java.lang.String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the number of rows matching the dynamic query
+	*/
+	public long dynamicQueryCount(DynamicQuery dynamicQuery);
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @param projection the projection to apply to the query
+	* @return the number of rows matching the dynamic query
+	*/
+	public long dynamicQueryCount(DynamicQuery dynamicQuery,
+		Projection projection);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalServiceUtil.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalServiceUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..7768cc51112339a805734153a993a0e8e2740e78
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalServiceUtil.java
@@ -0,0 +1,343 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.osgi.util.ServiceTrackerFactory;
+
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Provides the local service utility for Rack. This utility wraps
+ * {@link fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl} 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 Brian Wing Shun Chan
+ * @see RackLocalService
+ * @see fr.ippon.services.embercellar.service.base.RackLocalServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl
+ * @generated
+ */
+@ProviderType
+public class RackLocalServiceUtil {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this class directly. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl} and rerun ServiceBuilder to regenerate this class.
+	 */
+	public static com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery getActionableDynamicQuery() {
+		return getService().getActionableDynamicQuery();
+	}
+
+	public static com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
+		return getService().dynamicQuery();
+	}
+
+	public static com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		com.liferay.exportimport.kernel.lar.PortletDataContext portletDataContext) {
+		return getService().getExportActionableDynamicQuery(portletDataContext);
+	}
+
+	public static com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() {
+		return getService().getIndexableActionableDynamicQuery();
+	}
+
+	/**
+	* @throws PortalException
+	*/
+	public static com.liferay.portal.kernel.model.PersistedModel deletePersistedModel(
+		com.liferay.portal.kernel.model.PersistedModel persistedModel)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().deletePersistedModel(persistedModel);
+	}
+
+	public static com.liferay.portal.kernel.model.PersistedModel getPersistedModel(
+		java.io.Serializable primaryKeyObj)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().getPersistedModel(primaryKeyObj);
+	}
+
+	/**
+	* Adds the rack to the database. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was added
+	*/
+	public static fr.ippon.services.embercellar.model.Rack addRack(
+		fr.ippon.services.embercellar.model.Rack rack) {
+		return getService().addRack(rack);
+	}
+
+	public static fr.ippon.services.embercellar.model.Rack addRack(
+		long userId, long groupId, java.lang.String name, int nbColumns,
+		int nbRows, java.lang.String pathImg,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		return getService()
+				   .addRack(userId, groupId, name, nbColumns, nbRows, pathImg,
+			serviceContext);
+	}
+
+	/**
+	* Creates a new rack with the primary key. Does not add the rack to the database.
+	*
+	* @param rackId the primary key for the new rack
+	* @return the new rack
+	*/
+	public static fr.ippon.services.embercellar.model.Rack createRack(
+		long rackId) {
+		return getService().createRack(rackId);
+	}
+
+	/**
+	* Deletes the rack from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was removed
+	*/
+	public static fr.ippon.services.embercellar.model.Rack deleteRack(
+		fr.ippon.services.embercellar.model.Rack rack) {
+		return getService().deleteRack(rack);
+	}
+
+	/**
+	* Deletes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack that was removed
+	* @throws PortalException if a rack with the primary key could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Rack deleteRack(
+		long rackId) throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().deleteRack(rackId);
+	}
+
+	public static fr.ippon.services.embercellar.model.Rack fetchRack(
+		long rackId) {
+		return getService().fetchRack(rackId);
+	}
+
+	/**
+	* Returns the rack matching the UUID and group.
+	*
+	* @param uuid the rack's UUID
+	* @param groupId the primary key of the group
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Rack fetchRackByUuidAndGroupId(
+		java.lang.String uuid, long groupId) {
+		return getService().fetchRackByUuidAndGroupId(uuid, groupId);
+	}
+
+	public static fr.ippon.services.embercellar.model.Rack findByRackId(
+		long rackId) {
+		return getService().findByRackId(rackId);
+	}
+
+	/**
+	* Returns the rack with the primary key.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack
+	* @throws PortalException if a rack with the primary key could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Rack getRack(long rackId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().getRack(rackId);
+	}
+
+	/**
+	* Returns the rack matching the UUID and group.
+	*
+	* @param uuid the rack's UUID
+	* @param groupId the primary key of the group
+	* @return the matching rack
+	* @throws PortalException if a matching rack could not be found
+	*/
+	public static fr.ippon.services.embercellar.model.Rack getRackByUuidAndGroupId(
+		java.lang.String uuid, long groupId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return getService().getRackByUuidAndGroupId(uuid, groupId);
+	}
+
+	/**
+	* Updates the rack in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was updated
+	*/
+	public static fr.ippon.services.embercellar.model.Rack updateRack(
+		fr.ippon.services.embercellar.model.Rack rack) {
+		return getService().updateRack(rack);
+	}
+
+	/**
+	* Returns the number of racks.
+	*
+	* @return the number of racks
+	*/
+	public static int getRacksCount() {
+		return getService().getRacksCount();
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public static java.lang.String getOSGiServiceIdentifier() {
+		return getService().getOSGiServiceIdentifier();
+	}
+
+	/**
+	* Performs a dynamic query on the database and returns the matching rows.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the matching rows
+	*/
+	public static <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	*/
+	public static <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end) {
+		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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	*/
+	public static <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<T> orderByComparator) {
+		return getService()
+				   .dynamicQuery(dynamicQuery, start, end, orderByComparator);
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	* <p/>
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackLocalServiceUtil} to access the rack local service.
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Rack> findAll() {
+		return getService().findAll();
+	}
+
+	/**
+	* Returns a range of all the racks.
+	*
+	* <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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of racks
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Rack> getRacks(
+		int start, int end) {
+		return getService().getRacks(start, end);
+	}
+
+	/**
+	* Returns all the racks matching the UUID and company.
+	*
+	* @param uuid the UUID of the racks
+	* @param companyId the primary key of the company
+	* @return the matching racks, or an empty list if no matches were found
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Rack> getRacksByUuidAndCompanyId(
+		java.lang.String uuid, long companyId) {
+		return getService().getRacksByUuidAndCompanyId(uuid, companyId);
+	}
+
+	/**
+	* Returns a range of racks matching the UUID and company.
+	*
+	* @param uuid the UUID of the racks
+	* @param companyId the primary key of the company
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the range of matching racks, or an empty list if no matches were found
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Rack> getRacksByUuidAndCompanyId(
+		java.lang.String uuid, long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<fr.ippon.services.embercellar.model.Rack> orderByComparator) {
+		return getService()
+				   .getRacksByUuidAndCompanyId(uuid, companyId, start, end,
+			orderByComparator);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the number of rows matching the dynamic query
+	*/
+	public static long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		return getService().dynamicQueryCount(dynamicQuery);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @param projection the projection to apply to the query
+	* @return the number of rows matching the dynamic query
+	*/
+	public static long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
+		com.liferay.portal.kernel.dao.orm.Projection projection) {
+		return getService().dynamicQueryCount(dynamicQuery, projection);
+	}
+
+	public static RackLocalService getService() {
+		return _serviceTracker.getService();
+	}
+
+	private static ServiceTracker<RackLocalService, RackLocalService> _serviceTracker =
+		ServiceTrackerFactory.open(RackLocalService.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalServiceWrapper.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalServiceWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..de4bd76162a741562fb9362fff7457d856f31161
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackLocalServiceWrapper.java
@@ -0,0 +1,362 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.service.ServiceWrapper;
+
+/**
+ * Provides a wrapper for {@link RackLocalService}.
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackLocalService
+ * @generated
+ */
+@ProviderType
+public class RackLocalServiceWrapper implements RackLocalService,
+	ServiceWrapper<RackLocalService> {
+	public RackLocalServiceWrapper(RackLocalService rackLocalService) {
+		_rackLocalService = rackLocalService;
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery getActionableDynamicQuery() {
+		return _rackLocalService.getActionableDynamicQuery();
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery() {
+		return _rackLocalService.dynamicQuery();
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		com.liferay.exportimport.kernel.lar.PortletDataContext portletDataContext) {
+		return _rackLocalService.getExportActionableDynamicQuery(portletDataContext);
+	}
+
+	@Override
+	public com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() {
+		return _rackLocalService.getIndexableActionableDynamicQuery();
+	}
+
+	/**
+	* @throws PortalException
+	*/
+	@Override
+	public com.liferay.portal.kernel.model.PersistedModel deletePersistedModel(
+		com.liferay.portal.kernel.model.PersistedModel persistedModel)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _rackLocalService.deletePersistedModel(persistedModel);
+	}
+
+	@Override
+	public com.liferay.portal.kernel.model.PersistedModel getPersistedModel(
+		java.io.Serializable primaryKeyObj)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _rackLocalService.getPersistedModel(primaryKeyObj);
+	}
+
+	/**
+	* Adds the rack to the database. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was added
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack addRack(
+		fr.ippon.services.embercellar.model.Rack rack) {
+		return _rackLocalService.addRack(rack);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack addRack(long userId,
+		long groupId, java.lang.String name, int nbColumns, int nbRows,
+		java.lang.String pathImg,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		return _rackLocalService.addRack(userId, groupId, name, nbColumns,
+			nbRows, pathImg, serviceContext);
+	}
+
+	/**
+	* Creates a new rack with the primary key. Does not add the rack to the database.
+	*
+	* @param rackId the primary key for the new rack
+	* @return the new rack
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack createRack(long rackId) {
+		return _rackLocalService.createRack(rackId);
+	}
+
+	/**
+	* Deletes the rack from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was removed
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack deleteRack(
+		fr.ippon.services.embercellar.model.Rack rack) {
+		return _rackLocalService.deleteRack(rack);
+	}
+
+	/**
+	* Deletes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack that was removed
+	* @throws PortalException if a rack with the primary key could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack deleteRack(long rackId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _rackLocalService.deleteRack(rackId);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack fetchRack(long rackId) {
+		return _rackLocalService.fetchRack(rackId);
+	}
+
+	/**
+	* Returns the rack matching the UUID and group.
+	*
+	* @param uuid the rack's UUID
+	* @param groupId the primary key of the group
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack fetchRackByUuidAndGroupId(
+		java.lang.String uuid, long groupId) {
+		return _rackLocalService.fetchRackByUuidAndGroupId(uuid, groupId);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack findByRackId(long rackId) {
+		return _rackLocalService.findByRackId(rackId);
+	}
+
+	/**
+	* Returns the rack with the primary key.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack
+	* @throws PortalException if a rack with the primary key could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack getRack(long rackId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _rackLocalService.getRack(rackId);
+	}
+
+	/**
+	* Returns the rack matching the UUID and group.
+	*
+	* @param uuid the rack's UUID
+	* @param groupId the primary key of the group
+	* @return the matching rack
+	* @throws PortalException if a matching rack could not be found
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack getRackByUuidAndGroupId(
+		java.lang.String uuid, long groupId)
+		throws com.liferay.portal.kernel.exception.PortalException {
+		return _rackLocalService.getRackByUuidAndGroupId(uuid, groupId);
+	}
+
+	/**
+	* Updates the rack in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	*
+	* @param rack the rack
+	* @return the rack that was updated
+	*/
+	@Override
+	public fr.ippon.services.embercellar.model.Rack updateRack(
+		fr.ippon.services.embercellar.model.Rack rack) {
+		return _rackLocalService.updateRack(rack);
+	}
+
+	/**
+	* Returns the number of racks.
+	*
+	* @return the number of racks
+	*/
+	@Override
+	public int getRacksCount() {
+		return _rackLocalService.getRacksCount();
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	@Override
+	public java.lang.String getOSGiServiceIdentifier() {
+		return _rackLocalService.getOSGiServiceIdentifier();
+	}
+
+	/**
+	* Performs a dynamic query on the database and returns the matching rows.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the matching rows
+	*/
+	@Override
+	public <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		return _rackLocalService.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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	*/
+	@Override
+	public <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end) {
+		return _rackLocalService.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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	*/
+	@Override
+	public <T> java.util.List<T> dynamicQuery(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<T> orderByComparator) {
+		return _rackLocalService.dynamicQuery(dynamicQuery, start, end,
+			orderByComparator);
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	* <p/>
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackLocalServiceUtil} to access the rack local service.
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Rack> findAll() {
+		return _rackLocalService.findAll();
+	}
+
+	/**
+	* Returns a range of all the racks.
+	*
+	* <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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of racks
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Rack> getRacks(
+		int start, int end) {
+		return _rackLocalService.getRacks(start, end);
+	}
+
+	/**
+	* Returns all the racks matching the UUID and company.
+	*
+	* @param uuid the UUID of the racks
+	* @param companyId the primary key of the company
+	* @return the matching racks, or an empty list if no matches were found
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Rack> getRacksByUuidAndCompanyId(
+		java.lang.String uuid, long companyId) {
+		return _rackLocalService.getRacksByUuidAndCompanyId(uuid, companyId);
+	}
+
+	/**
+	* Returns a range of racks matching the UUID and company.
+	*
+	* @param uuid the UUID of the racks
+	* @param companyId the primary key of the company
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the range of matching racks, or an empty list if no matches were found
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Rack> getRacksByUuidAndCompanyId(
+		java.lang.String uuid, long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<fr.ippon.services.embercellar.model.Rack> orderByComparator) {
+		return _rackLocalService.getRacksByUuidAndCompanyId(uuid, companyId,
+			start, end, orderByComparator);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @return the number of rows matching the dynamic query
+	*/
+	@Override
+	public long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery) {
+		return _rackLocalService.dynamicQueryCount(dynamicQuery);
+	}
+
+	/**
+	* Returns the number of rows matching the dynamic query.
+	*
+	* @param dynamicQuery the dynamic query
+	* @param projection the projection to apply to the query
+	* @return the number of rows matching the dynamic query
+	*/
+	@Override
+	public long dynamicQueryCount(
+		com.liferay.portal.kernel.dao.orm.DynamicQuery dynamicQuery,
+		com.liferay.portal.kernel.dao.orm.Projection projection) {
+		return _rackLocalService.dynamicQueryCount(dynamicQuery, projection);
+	}
+
+	@Override
+	public RackLocalService getWrappedService() {
+		return _rackLocalService;
+	}
+
+	@Override
+	public void setWrappedService(RackLocalService rackLocalService) {
+		_rackLocalService = rackLocalService;
+	}
+
+	private RackLocalService _rackLocalService;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackService.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackService.java
new file mode 100644
index 0000000000000000000000000000000000000000..5650610db1ace84691327323deecc60409a5c3d7
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackService.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+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.security.access.control.AccessControlled;
+import com.liferay.portal.kernel.service.BaseService;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.spring.osgi.OSGiBeanProperties;
+import com.liferay.portal.kernel.transaction.Isolation;
+import com.liferay.portal.kernel.transaction.Transactional;
+
+import fr.ippon.services.embercellar.model.Rack;
+
+import java.util.List;
+
+/**
+ * Provides the remote service interface for Rack. Methods of this
+ * service are expected to have security checks based on the propagated JAAS
+ * credentials because this service can be accessed remotely.
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackServiceUtil
+ * @see fr.ippon.services.embercellar.service.base.RackServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.RackServiceImpl
+ * @generated
+ */
+@AccessControlled
+@JSONWebService
+@OSGiBeanProperties(property =  {
+	"json.web.service.context.name=embercellar", "json.web.service.context.path=Rack"}, service = RackService.class)
+@ProviderType
+@Transactional(isolation = Isolation.PORTAL, rollbackFor =  {
+	PortalException.class, SystemException.class})
+public interface RackService extends BaseService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. Always use {@link RackServiceUtil} to access the rack remote service. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.RackServiceImpl} and rerun ServiceBuilder to automatically copy the method declarations to this interface.
+	 */
+	public Rack addRack(java.lang.String name, int nbColumns, int nbRows,
+		java.lang.String pathImg, ServiceContext serviceContext);
+
+	public Rack findByRackId(long rackId);
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public java.lang.String getOSGiServiceIdentifier();
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackServiceUtil} to access the rack remote service.
+	*/
+	public List<Rack> findAll();
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackServiceUtil.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackServiceUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..f155598ca913ed6cd5e2d009042fb56cd45b23b6
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackServiceUtil.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.osgi.util.ServiceTrackerFactory;
+
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Provides the remote service utility for Rack. This utility wraps
+ * {@link fr.ippon.services.embercellar.service.impl.RackServiceImpl} 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 Brian Wing Shun Chan
+ * @see RackService
+ * @see fr.ippon.services.embercellar.service.base.RackServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.impl.RackServiceImpl
+ * @generated
+ */
+@ProviderType
+public class RackServiceUtil {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this class directly. Add custom service methods to {@link fr.ippon.services.embercellar.service.impl.RackServiceImpl} and rerun ServiceBuilder to regenerate this class.
+	 */
+	public static fr.ippon.services.embercellar.model.Rack addRack(
+		java.lang.String name, int nbColumns, int nbRows,
+		java.lang.String pathImg,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext) {
+		return getService()
+				   .addRack(name, nbColumns, nbRows, pathImg, serviceContext);
+	}
+
+	public static fr.ippon.services.embercellar.model.Rack findByRackId(
+		long rackId) {
+		return getService().findByRackId(rackId);
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	public static java.lang.String getOSGiServiceIdentifier() {
+		return getService().getOSGiServiceIdentifier();
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackServiceUtil} to access the rack remote service.
+	*/
+	public static java.util.List<fr.ippon.services.embercellar.model.Rack> findAll() {
+		return getService().findAll();
+	}
+
+	public static RackService getService() {
+		return _serviceTracker.getService();
+	}
+
+	private static ServiceTracker<RackService, RackService> _serviceTracker = ServiceTrackerFactory.open(RackService.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackServiceWrapper.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackServiceWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..47647c1ada47801db2f1487af60f58269988206a
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/RackServiceWrapper.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.service.ServiceWrapper;
+
+/**
+ * Provides a wrapper for {@link RackService}.
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackService
+ * @generated
+ */
+@ProviderType
+public class RackServiceWrapper implements RackService,
+	ServiceWrapper<RackService> {
+	public RackServiceWrapper(RackService rackService) {
+		_rackService = rackService;
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack addRack(
+		java.lang.String name, int nbColumns, int nbRows,
+		java.lang.String pathImg,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext) {
+		return _rackService.addRack(name, nbColumns, nbRows, pathImg,
+			serviceContext);
+	}
+
+	@Override
+	public fr.ippon.services.embercellar.model.Rack findByRackId(long rackId) {
+		return _rackService.findByRackId(rackId);
+	}
+
+	/**
+	* Returns the OSGi service identifier.
+	*
+	* @return the OSGi service identifier
+	*/
+	@Override
+	public java.lang.String getOSGiServiceIdentifier() {
+		return _rackService.getOSGiServiceIdentifier();
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackServiceUtil} to access the rack remote service.
+	*/
+	@Override
+	public java.util.List<fr.ippon.services.embercellar.model.Rack> findAll() {
+		return _rackService.findAll();
+	}
+
+	@Override
+	public RackService getWrappedService() {
+		return _rackService;
+	}
+
+	@Override
+	public void setWrappedService(RackService rackService) {
+		_rackService = rackService;
+	}
+
+	private RackService _rackService;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/BottlePersistence.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/BottlePersistence.java
new file mode 100644
index 0000000000000000000000000000000000000000..2124d62af8d95811c354786faa5df2137fc601ad
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/BottlePersistence.java
@@ -0,0 +1,750 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.persistence;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.service.persistence.BasePersistence;
+
+import fr.ippon.services.embercellar.exception.NoSuchBottleException;
+import fr.ippon.services.embercellar.model.Bottle;
+
+/**
+ * The persistence interface for the bottle service.
+ *
+ * <p>
+ * Caching information and settings can be found in <code>portal.properties</code>
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.persistence.impl.BottlePersistenceImpl
+ * @see BottleUtil
+ * @generated
+ */
+@ProviderType
+public interface BottlePersistence extends BasePersistence<Bottle> {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. Always use {@link BottleUtil} to access the bottle persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this interface.
+	 */
+
+	/**
+	* Returns all the bottles where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid(java.lang.String uuid);
+
+	/**
+	* Returns a range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid(java.lang.String uuid, int start,
+		int end);
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid(java.lang.String uuid, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid(java.lang.String uuid, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByUuid_First(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the first bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByUuid_First(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the last bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByUuid_Last(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the last bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByUuid_Last(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where uuid = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @param uuid the uuid
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public Bottle[] findByUuid_PrevAndNext(long bottleId,
+		java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Removes all the bottles where uuid = &#63; from the database.
+	*
+	* @param uuid the uuid
+	*/
+	public void removeByUuid(java.lang.String uuid);
+
+	/**
+	* Returns the number of bottles where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the number of matching bottles
+	*/
+	public int countByUuid(java.lang.String uuid);
+
+	/**
+	* Returns the bottle where uuid = &#63; and groupId = &#63; or throws a {@link NoSuchBottleException} if it could not be found.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByUUID_G(java.lang.String uuid, long groupId)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the bottle where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByUUID_G(java.lang.String uuid, long groupId);
+
+	/**
+	* Returns the bottle where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByUUID_G(java.lang.String uuid, long groupId,
+		boolean retrieveFromCache);
+
+	/**
+	* Removes the bottle where uuid = &#63; and groupId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the bottle that was removed
+	*/
+	public Bottle removeByUUID_G(java.lang.String uuid, long groupId)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the number of bottles where uuid = &#63; and groupId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the number of matching bottles
+	*/
+	public int countByUUID_G(java.lang.String uuid, long groupId);
+
+	/**
+	* Returns all the bottles where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId);
+
+	/**
+	* Returns a range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end);
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByUuid_C_First(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the first bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByUuid_C_First(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the last bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByUuid_C_Last(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the last bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByUuid_C_Last(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where uuid = &#63; and companyId = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @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 bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public Bottle[] findByUuid_C_PrevAndNext(long bottleId,
+		java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Removes all the bottles where uuid = &#63; and companyId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	*/
+	public void removeByUuid_C(java.lang.String uuid, long companyId);
+
+	/**
+	* Returns the number of bottles where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the number of matching bottles
+	*/
+	public int countByUuid_C(java.lang.String uuid, long companyId);
+
+	/**
+	* Returns all the bottles where name = &#63;.
+	*
+	* @param name the name
+	* @return the matching bottles
+	*/
+	public java.util.List<Bottle> findByName(java.lang.String name);
+
+	/**
+	* Returns a range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public java.util.List<Bottle> findByName(java.lang.String name, int start,
+		int end);
+
+	/**
+	* Returns an ordered range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByName(java.lang.String name, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByName(java.lang.String name, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByName_First(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the first bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByName_First(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the last bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByName_Last(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the last bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByName_Last(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where name = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public Bottle[] findByName_PrevAndNext(long bottleId,
+		java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Removes all the bottles where name = &#63; from the database.
+	*
+	* @param name the name
+	*/
+	public void removeByName(java.lang.String name);
+
+	/**
+	* Returns the number of bottles where name = &#63;.
+	*
+	* @param name the name
+	* @return the number of matching bottles
+	*/
+	public int countByName(java.lang.String name);
+
+	/**
+	* Returns all the bottles where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @return the matching bottles
+	*/
+	public java.util.List<Bottle> findByRackId(long rackId);
+
+	/**
+	* Returns a range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public java.util.List<Bottle> findByRackId(long rackId, int start, int end);
+
+	/**
+	* Returns an ordered range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByRackId(long rackId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public java.util.List<Bottle> findByRackId(long rackId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByRackId_First(long rackId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the first bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByRackId_First(long rackId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the last bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public Bottle findByRackId_Last(long rackId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Returns the last bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public Bottle fetchByRackId_Last(long rackId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where rackId = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public Bottle[] findByRackId_PrevAndNext(long bottleId, long rackId,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException;
+
+	/**
+	* Removes all the bottles where rackId = &#63; from the database.
+	*
+	* @param rackId the rack ID
+	*/
+	public void removeByRackId(long rackId);
+
+	/**
+	* Returns the number of bottles where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @return the number of matching bottles
+	*/
+	public int countByRackId(long rackId);
+
+	/**
+	* Caches the bottle in the entity cache if it is enabled.
+	*
+	* @param bottle the bottle
+	*/
+	public void cacheResult(Bottle bottle);
+
+	/**
+	* Caches the bottles in the entity cache if it is enabled.
+	*
+	* @param bottles the bottles
+	*/
+	public void cacheResult(java.util.List<Bottle> bottles);
+
+	/**
+	* Creates a new bottle with the primary key. Does not add the bottle to the database.
+	*
+	* @param bottleId the primary key for the new bottle
+	* @return the new bottle
+	*/
+	public Bottle create(long bottleId);
+
+	/**
+	* Removes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle that was removed
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public Bottle remove(long bottleId) throws NoSuchBottleException;
+
+	public Bottle updateImpl(Bottle bottle);
+
+	/**
+	* Returns the bottle with the primary key or throws a {@link NoSuchBottleException} if it could not be found.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public Bottle findByPrimaryKey(long bottleId) throws NoSuchBottleException;
+
+	/**
+	* Returns the bottle with the primary key or returns <code>null</code> if it could not be found.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle, or <code>null</code> if a bottle with the primary key could not be found
+	*/
+	public Bottle fetchByPrimaryKey(long bottleId);
+
+	@Override
+	public java.util.Map<java.io.Serializable, Bottle> fetchByPrimaryKeys(
+		java.util.Set<java.io.Serializable> primaryKeys);
+
+	/**
+	* Returns all the bottles.
+	*
+	* @return the bottles
+	*/
+	public java.util.List<Bottle> findAll();
+
+	/**
+	* Returns a range of all the bottles.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of bottles
+	*/
+	public java.util.List<Bottle> findAll(int start, int end);
+
+	/**
+	* Returns an ordered range of all the bottles.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of bottles
+	*/
+	public java.util.List<Bottle> findAll(int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the bottles.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of bottles
+	*/
+	public java.util.List<Bottle> findAll(int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Removes all the bottles from the database.
+	*/
+	public void removeAll();
+
+	/**
+	* Returns the number of bottles.
+	*
+	* @return the number of bottles
+	*/
+	public int countAll();
+
+	@Override
+	public java.util.Set<java.lang.String> getBadColumnNames();
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/BottleUtil.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/BottleUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..b298909abae3d7eb26ba1135f83a21f6a08ebf3e
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/BottleUtil.java
@@ -0,0 +1,963 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.persistence;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.osgi.util.ServiceTrackerFactory;
+
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.util.OrderByComparator;
+
+import fr.ippon.services.embercellar.model.Bottle;
+
+import org.osgi.util.tracker.ServiceTracker;
+
+import java.util.List;
+
+/**
+ * The persistence utility for the bottle service. This utility wraps {@link fr.ippon.services.embercellar.service.persistence.impl.BottlePersistenceImpl} 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 Brian Wing Shun Chan
+ * @see BottlePersistence
+ * @see fr.ippon.services.embercellar.service.persistence.impl.BottlePersistenceImpl
+ * @generated
+ */
+@ProviderType
+public class BottleUtil {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this class directly. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
+	 */
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#clearCache()
+	 */
+	public static void clearCache() {
+		getPersistence().clearCache();
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#clearCache(com.liferay.portal.kernel.model.BaseModel)
+	 */
+	public static void clearCache(Bottle bottle) {
+		getPersistence().clearCache(bottle);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#countWithDynamicQuery(DynamicQuery)
+	 */
+	public static long countWithDynamicQuery(DynamicQuery dynamicQuery) {
+		return getPersistence().countWithDynamicQuery(dynamicQuery);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery)
+	 */
+	public static List<Bottle> findWithDynamicQuery(DynamicQuery dynamicQuery) {
+		return getPersistence().findWithDynamicQuery(dynamicQuery);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int)
+	 */
+	public static List<Bottle> findWithDynamicQuery(DynamicQuery dynamicQuery,
+		int start, int end) {
+		return getPersistence().findWithDynamicQuery(dynamicQuery, start, end);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int, OrderByComparator)
+	 */
+	public static List<Bottle> findWithDynamicQuery(DynamicQuery dynamicQuery,
+		int start, int end, OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence()
+				   .findWithDynamicQuery(dynamicQuery, start, end,
+			orderByComparator);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#update(com.liferay.portal.kernel.model.BaseModel)
+	 */
+	public static Bottle update(Bottle bottle) {
+		return getPersistence().update(bottle);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#update(com.liferay.portal.kernel.model.BaseModel, ServiceContext)
+	 */
+	public static Bottle update(Bottle bottle, ServiceContext serviceContext) {
+		return getPersistence().update(bottle, serviceContext);
+	}
+
+	/**
+	* Returns all the bottles where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the matching bottles
+	*/
+	public static List<Bottle> findByUuid(java.lang.String uuid) {
+		return getPersistence().findByUuid(uuid);
+	}
+
+	/**
+	* Returns a range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public static List<Bottle> findByUuid(java.lang.String uuid, int start,
+		int end) {
+		return getPersistence().findByUuid(uuid, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByUuid(java.lang.String uuid, int start,
+		int end, OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().findByUuid(uuid, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByUuid(java.lang.String uuid, int start,
+		int end, OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByUuid(uuid, start, end, orderByComparator,
+			retrieveFromCache);
+	}
+
+	/**
+	* Returns the first bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByUuid_First(java.lang.String uuid,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByUuid_First(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the first bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByUuid_First(java.lang.String uuid,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().fetchByUuid_First(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByUuid_Last(java.lang.String uuid,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByUuid_Last(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByUuid_Last(java.lang.String uuid,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().fetchByUuid_Last(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where uuid = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @param uuid the uuid
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public static Bottle[] findByUuid_PrevAndNext(long bottleId,
+		java.lang.String uuid, OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence()
+				   .findByUuid_PrevAndNext(bottleId, uuid, orderByComparator);
+	}
+
+	/**
+	* Removes all the bottles where uuid = &#63; from the database.
+	*
+	* @param uuid the uuid
+	*/
+	public static void removeByUuid(java.lang.String uuid) {
+		getPersistence().removeByUuid(uuid);
+	}
+
+	/**
+	* Returns the number of bottles where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the number of matching bottles
+	*/
+	public static int countByUuid(java.lang.String uuid) {
+		return getPersistence().countByUuid(uuid);
+	}
+
+	/**
+	* Returns the bottle where uuid = &#63; and groupId = &#63; or throws a {@link NoSuchBottleException} if it could not be found.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByUUID_G(java.lang.String uuid, long groupId)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns the bottle where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByUUID_G(java.lang.String uuid, long groupId) {
+		return getPersistence().fetchByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns the bottle where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByUUID_G(java.lang.String uuid, long groupId,
+		boolean retrieveFromCache) {
+		return getPersistence().fetchByUUID_G(uuid, groupId, retrieveFromCache);
+	}
+
+	/**
+	* Removes the bottle where uuid = &#63; and groupId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the bottle that was removed
+	*/
+	public static Bottle removeByUUID_G(java.lang.String uuid, long groupId)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().removeByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns the number of bottles where uuid = &#63; and groupId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the number of matching bottles
+	*/
+	public static int countByUUID_G(java.lang.String uuid, long groupId) {
+		return getPersistence().countByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns all the bottles where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the matching bottles
+	*/
+	public static List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId) {
+		return getPersistence().findByUuid_C(uuid, companyId);
+	}
+
+	/**
+	* Returns a range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public static List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end) {
+		return getPersistence().findByUuid_C(uuid, companyId, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence()
+				   .findByUuid_C(uuid, companyId, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByUuid_C(uuid, companyId, start, end,
+			orderByComparator, retrieveFromCache);
+	}
+
+	/**
+	* Returns the first bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByUuid_C_First(java.lang.String uuid,
+		long companyId, OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence()
+				   .findByUuid_C_First(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the first bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByUuid_C_First(java.lang.String uuid,
+		long companyId, OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence()
+				   .fetchByUuid_C_First(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle 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 bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByUuid_C_Last(java.lang.String uuid,
+		long companyId, OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence()
+				   .findByUuid_C_Last(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByUuid_C_Last(java.lang.String uuid,
+		long companyId, OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence()
+				   .fetchByUuid_C_Last(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where uuid = &#63; and companyId = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @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 bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public static Bottle[] findByUuid_C_PrevAndNext(long bottleId,
+		java.lang.String uuid, long companyId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence()
+				   .findByUuid_C_PrevAndNext(bottleId, uuid, companyId,
+			orderByComparator);
+	}
+
+	/**
+	* Removes all the bottles where uuid = &#63; and companyId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	*/
+	public static void removeByUuid_C(java.lang.String uuid, long companyId) {
+		getPersistence().removeByUuid_C(uuid, companyId);
+	}
+
+	/**
+	* Returns the number of bottles where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the number of matching bottles
+	*/
+	public static int countByUuid_C(java.lang.String uuid, long companyId) {
+		return getPersistence().countByUuid_C(uuid, companyId);
+	}
+
+	/**
+	* Returns all the bottles where name = &#63;.
+	*
+	* @param name the name
+	* @return the matching bottles
+	*/
+	public static List<Bottle> findByName(java.lang.String name) {
+		return getPersistence().findByName(name);
+	}
+
+	/**
+	* Returns a range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public static List<Bottle> findByName(java.lang.String name, int start,
+		int end) {
+		return getPersistence().findByName(name, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByName(java.lang.String name, int start,
+		int end, OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().findByName(name, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByName(java.lang.String name, int start,
+		int end, OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByName(name, start, end, orderByComparator,
+			retrieveFromCache);
+	}
+
+	/**
+	* Returns the first bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByName_First(java.lang.String name,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByName_First(name, orderByComparator);
+	}
+
+	/**
+	* Returns the first bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByName_First(java.lang.String name,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().fetchByName_First(name, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByName_Last(java.lang.String name,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByName_Last(name, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByName_Last(java.lang.String name,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().fetchByName_Last(name, orderByComparator);
+	}
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where name = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public static Bottle[] findByName_PrevAndNext(long bottleId,
+		java.lang.String name, OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence()
+				   .findByName_PrevAndNext(bottleId, name, orderByComparator);
+	}
+
+	/**
+	* Removes all the bottles where name = &#63; from the database.
+	*
+	* @param name the name
+	*/
+	public static void removeByName(java.lang.String name) {
+		getPersistence().removeByName(name);
+	}
+
+	/**
+	* Returns the number of bottles where name = &#63;.
+	*
+	* @param name the name
+	* @return the number of matching bottles
+	*/
+	public static int countByName(java.lang.String name) {
+		return getPersistence().countByName(name);
+	}
+
+	/**
+	* Returns all the bottles where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @return the matching bottles
+	*/
+	public static List<Bottle> findByRackId(long rackId) {
+		return getPersistence().findByRackId(rackId);
+	}
+
+	/**
+	* Returns a range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of matching bottles
+	*/
+	public static List<Bottle> findByRackId(long rackId, int start, int end) {
+		return getPersistence().findByRackId(rackId, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByRackId(long rackId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence()
+				   .findByRackId(rackId, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	* @param start the lower bound of the range of bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching bottles
+	*/
+	public static List<Bottle> findByRackId(long rackId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByRackId(rackId, start, end, orderByComparator,
+			retrieveFromCache);
+	}
+
+	/**
+	* Returns the first bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByRackId_First(long rackId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByRackId_First(rackId, orderByComparator);
+	}
+
+	/**
+	* Returns the first bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByRackId_First(long rackId,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().fetchByRackId_First(rackId, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle
+	* @throws NoSuchBottleException if a matching bottle could not be found
+	*/
+	public static Bottle findByRackId_Last(long rackId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByRackId_Last(rackId, orderByComparator);
+	}
+
+	/**
+	* Returns the last bottle in the ordered set where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching bottle, or <code>null</code> if a matching bottle could not be found
+	*/
+	public static Bottle fetchByRackId_Last(long rackId,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().fetchByRackId_Last(rackId, orderByComparator);
+	}
+
+	/**
+	* Returns the bottles before and after the current bottle in the ordered set where rackId = &#63;.
+	*
+	* @param bottleId the primary key of the current bottle
+	* @param rackId the rack ID
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public static Bottle[] findByRackId_PrevAndNext(long bottleId, long rackId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence()
+				   .findByRackId_PrevAndNext(bottleId, rackId, orderByComparator);
+	}
+
+	/**
+	* Removes all the bottles where rackId = &#63; from the database.
+	*
+	* @param rackId the rack ID
+	*/
+	public static void removeByRackId(long rackId) {
+		getPersistence().removeByRackId(rackId);
+	}
+
+	/**
+	* Returns the number of bottles where rackId = &#63;.
+	*
+	* @param rackId the rack ID
+	* @return the number of matching bottles
+	*/
+	public static int countByRackId(long rackId) {
+		return getPersistence().countByRackId(rackId);
+	}
+
+	/**
+	* Caches the bottle in the entity cache if it is enabled.
+	*
+	* @param bottle the bottle
+	*/
+	public static void cacheResult(Bottle bottle) {
+		getPersistence().cacheResult(bottle);
+	}
+
+	/**
+	* Caches the bottles in the entity cache if it is enabled.
+	*
+	* @param bottles the bottles
+	*/
+	public static void cacheResult(List<Bottle> bottles) {
+		getPersistence().cacheResult(bottles);
+	}
+
+	/**
+	* Creates a new bottle with the primary key. Does not add the bottle to the database.
+	*
+	* @param bottleId the primary key for the new bottle
+	* @return the new bottle
+	*/
+	public static Bottle create(long bottleId) {
+		return getPersistence().create(bottleId);
+	}
+
+	/**
+	* Removes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle that was removed
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public static Bottle remove(long bottleId)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().remove(bottleId);
+	}
+
+	public static Bottle updateImpl(Bottle bottle) {
+		return getPersistence().updateImpl(bottle);
+	}
+
+	/**
+	* Returns the bottle with the primary key or throws a {@link NoSuchBottleException} if it could not be found.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle
+	* @throws NoSuchBottleException if a bottle with the primary key could not be found
+	*/
+	public static Bottle findByPrimaryKey(long bottleId)
+		throws fr.ippon.services.embercellar.exception.NoSuchBottleException {
+		return getPersistence().findByPrimaryKey(bottleId);
+	}
+
+	/**
+	* Returns the bottle with the primary key or returns <code>null</code> if it could not be found.
+	*
+	* @param bottleId the primary key of the bottle
+	* @return the bottle, or <code>null</code> if a bottle with the primary key could not be found
+	*/
+	public static Bottle fetchByPrimaryKey(long bottleId) {
+		return getPersistence().fetchByPrimaryKey(bottleId);
+	}
+
+	public static java.util.Map<java.io.Serializable, Bottle> fetchByPrimaryKeys(
+		java.util.Set<java.io.Serializable> primaryKeys) {
+		return getPersistence().fetchByPrimaryKeys(primaryKeys);
+	}
+
+	/**
+	* Returns all the bottles.
+	*
+	* @return the bottles
+	*/
+	public static List<Bottle> findAll() {
+		return getPersistence().findAll();
+	}
+
+	/**
+	* Returns a range of all the bottles.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @return the range of bottles
+	*/
+	public static List<Bottle> findAll(int start, int end) {
+		return getPersistence().findAll(start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of bottles
+	*/
+	public static List<Bottle> findAll(int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return getPersistence().findAll(start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the bottles.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	* @param end the upper bound of the range of bottles (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of bottles
+	*/
+	public static List<Bottle> findAll(int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		return getPersistence()
+				   .findAll(start, end, orderByComparator, retrieveFromCache);
+	}
+
+	/**
+	* Removes all the bottles from the database.
+	*/
+	public static void removeAll() {
+		getPersistence().removeAll();
+	}
+
+	/**
+	* Returns the number of bottles.
+	*
+	* @return the number of bottles
+	*/
+	public static int countAll() {
+		return getPersistence().countAll();
+	}
+
+	public static java.util.Set<java.lang.String> getBadColumnNames() {
+		return getPersistence().getBadColumnNames();
+	}
+
+	public static BottlePersistence getPersistence() {
+		return _serviceTracker.getService();
+	}
+
+	private static ServiceTracker<BottlePersistence, BottlePersistence> _serviceTracker =
+		ServiceTrackerFactory.open(BottlePersistence.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/RackPersistence.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/RackPersistence.java
new file mode 100644
index 0000000000000000000000000000000000000000..b63152a809b604d0b667e60210ee7bf9b4c742ee
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/RackPersistence.java
@@ -0,0 +1,620 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.persistence;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.service.persistence.BasePersistence;
+
+import fr.ippon.services.embercellar.exception.NoSuchRackException;
+import fr.ippon.services.embercellar.model.Rack;
+
+/**
+ * The persistence interface for the rack service.
+ *
+ * <p>
+ * Caching information and settings can be found in <code>portal.properties</code>
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.persistence.impl.RackPersistenceImpl
+ * @see RackUtil
+ * @generated
+ */
+@ProviderType
+public interface RackPersistence extends BasePersistence<Rack> {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this interface directly. Always use {@link RackUtil} to access the rack persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this interface.
+	 */
+
+	/**
+	* Returns all the racks where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the matching racks
+	*/
+	public java.util.List<Rack> findByUuid(java.lang.String uuid);
+
+	/**
+	* Returns a range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of matching racks
+	*/
+	public java.util.List<Rack> findByUuid(java.lang.String uuid, int start,
+		int end);
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching racks
+	*/
+	public java.util.List<Rack> findByUuid(java.lang.String uuid, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching racks
+	*/
+	public java.util.List<Rack> findByUuid(java.lang.String uuid, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByUuid_First(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the first rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByUuid_First(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the last rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByUuid_Last(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the last rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByUuid_Last(java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the racks before and after the current rack in the ordered set where uuid = &#63;.
+	*
+	* @param rackId the primary key of the current rack
+	* @param uuid the uuid
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public Rack[] findByUuid_PrevAndNext(long rackId, java.lang.String uuid,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Removes all the racks where uuid = &#63; from the database.
+	*
+	* @param uuid the uuid
+	*/
+	public void removeByUuid(java.lang.String uuid);
+
+	/**
+	* Returns the number of racks where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the number of matching racks
+	*/
+	public int countByUuid(java.lang.String uuid);
+
+	/**
+	* Returns the rack where uuid = &#63; and groupId = &#63; or throws a {@link NoSuchRackException} if it could not be found.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByUUID_G(java.lang.String uuid, long groupId)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the rack where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByUUID_G(java.lang.String uuid, long groupId);
+
+	/**
+	* Returns the rack where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByUUID_G(java.lang.String uuid, long groupId,
+		boolean retrieveFromCache);
+
+	/**
+	* Removes the rack where uuid = &#63; and groupId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the rack that was removed
+	*/
+	public Rack removeByUUID_G(java.lang.String uuid, long groupId)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the number of racks where uuid = &#63; and groupId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the number of matching racks
+	*/
+	public int countByUUID_G(java.lang.String uuid, long groupId);
+
+	/**
+	* Returns all the racks where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the matching racks
+	*/
+	public java.util.List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId);
+
+	/**
+	* Returns a range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of matching racks
+	*/
+	public java.util.List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end);
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching racks
+	*/
+	public java.util.List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching racks
+	*/
+	public java.util.List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByUuid_C_First(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the first rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByUuid_C_First(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the last rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByUuid_C_Last(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the last rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByUuid_C_Last(java.lang.String uuid, long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the racks before and after the current rack in the ordered set where uuid = &#63; and companyId = &#63;.
+	*
+	* @param rackId the primary key of the current rack
+	* @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 rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public Rack[] findByUuid_C_PrevAndNext(long rackId, java.lang.String uuid,
+		long companyId,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Removes all the racks where uuid = &#63; and companyId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	*/
+	public void removeByUuid_C(java.lang.String uuid, long companyId);
+
+	/**
+	* Returns the number of racks where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the number of matching racks
+	*/
+	public int countByUuid_C(java.lang.String uuid, long companyId);
+
+	/**
+	* Returns all the racks where name = &#63;.
+	*
+	* @param name the name
+	* @return the matching racks
+	*/
+	public java.util.List<Rack> findByName(java.lang.String name);
+
+	/**
+	* Returns a range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of matching racks
+	*/
+	public java.util.List<Rack> findByName(java.lang.String name, int start,
+		int end);
+
+	/**
+	* Returns an ordered range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching racks
+	*/
+	public java.util.List<Rack> findByName(java.lang.String name, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching racks
+	*/
+	public java.util.List<Rack> findByName(java.lang.String name, int start,
+		int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Returns the first rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByName_First(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the first rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByName_First(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the last rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public Rack findByName_Last(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Returns the last rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public Rack fetchByName_Last(java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns the racks before and after the current rack in the ordered set where name = &#63;.
+	*
+	* @param rackId the primary key of the current rack
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public Rack[] findByName_PrevAndNext(long rackId, java.lang.String name,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException;
+
+	/**
+	* Removes all the racks where name = &#63; from the database.
+	*
+	* @param name the name
+	*/
+	public void removeByName(java.lang.String name);
+
+	/**
+	* Returns the number of racks where name = &#63;.
+	*
+	* @param name the name
+	* @return the number of matching racks
+	*/
+	public int countByName(java.lang.String name);
+
+	/**
+	* Caches the rack in the entity cache if it is enabled.
+	*
+	* @param rack the rack
+	*/
+	public void cacheResult(Rack rack);
+
+	/**
+	* Caches the racks in the entity cache if it is enabled.
+	*
+	* @param racks the racks
+	*/
+	public void cacheResult(java.util.List<Rack> racks);
+
+	/**
+	* Creates a new rack with the primary key. Does not add the rack to the database.
+	*
+	* @param rackId the primary key for the new rack
+	* @return the new rack
+	*/
+	public Rack create(long rackId);
+
+	/**
+	* Removes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack that was removed
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public Rack remove(long rackId) throws NoSuchRackException;
+
+	public Rack updateImpl(Rack rack);
+
+	/**
+	* Returns the rack with the primary key or throws a {@link NoSuchRackException} if it could not be found.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public Rack findByPrimaryKey(long rackId) throws NoSuchRackException;
+
+	/**
+	* Returns the rack with the primary key or returns <code>null</code> if it could not be found.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack, or <code>null</code> if a rack with the primary key could not be found
+	*/
+	public Rack fetchByPrimaryKey(long rackId);
+
+	@Override
+	public java.util.Map<java.io.Serializable, Rack> fetchByPrimaryKeys(
+		java.util.Set<java.io.Serializable> primaryKeys);
+
+	/**
+	* Returns all the racks.
+	*
+	* @return the racks
+	*/
+	public java.util.List<Rack> findAll();
+
+	/**
+	* Returns a range of all the racks.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of racks
+	*/
+	public java.util.List<Rack> findAll(int start, int end);
+
+	/**
+	* Returns an ordered range of all the racks.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of racks
+	*/
+	public java.util.List<Rack> findAll(int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator);
+
+	/**
+	* Returns an ordered range of all the racks.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of racks
+	*/
+	public java.util.List<Rack> findAll(int start, int end,
+		com.liferay.portal.kernel.util.OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache);
+
+	/**
+	* Removes all the racks from the database.
+	*/
+	public void removeAll();
+
+	/**
+	* Returns the number of racks.
+	*
+	* @return the number of racks
+	*/
+	public int countAll();
+
+	@Override
+	public java.util.Set<java.lang.String> getBadColumnNames();
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/RackUtil.java b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/RackUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..761a4569a334dd61349b60c5c054c09b371023ad
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-api/src/main/java/fr/ippon/services/embercellar/service/persistence/RackUtil.java
@@ -0,0 +1,809 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.persistence;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.osgi.util.ServiceTrackerFactory;
+
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.util.OrderByComparator;
+
+import fr.ippon.services.embercellar.model.Rack;
+
+import org.osgi.util.tracker.ServiceTracker;
+
+import java.util.List;
+
+/**
+ * The persistence utility for the rack service. This utility wraps {@link fr.ippon.services.embercellar.service.persistence.impl.RackPersistenceImpl} 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 Brian Wing Shun Chan
+ * @see RackPersistence
+ * @see fr.ippon.services.embercellar.service.persistence.impl.RackPersistenceImpl
+ * @generated
+ */
+@ProviderType
+public class RackUtil {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify this class directly. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
+	 */
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#clearCache()
+	 */
+	public static void clearCache() {
+		getPersistence().clearCache();
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#clearCache(com.liferay.portal.kernel.model.BaseModel)
+	 */
+	public static void clearCache(Rack rack) {
+		getPersistence().clearCache(rack);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#countWithDynamicQuery(DynamicQuery)
+	 */
+	public static long countWithDynamicQuery(DynamicQuery dynamicQuery) {
+		return getPersistence().countWithDynamicQuery(dynamicQuery);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery)
+	 */
+	public static List<Rack> findWithDynamicQuery(DynamicQuery dynamicQuery) {
+		return getPersistence().findWithDynamicQuery(dynamicQuery);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int)
+	 */
+	public static List<Rack> findWithDynamicQuery(DynamicQuery dynamicQuery,
+		int start, int end) {
+		return getPersistence().findWithDynamicQuery(dynamicQuery, start, end);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#findWithDynamicQuery(DynamicQuery, int, int, OrderByComparator)
+	 */
+	public static List<Rack> findWithDynamicQuery(DynamicQuery dynamicQuery,
+		int start, int end, OrderByComparator<Rack> orderByComparator) {
+		return getPersistence()
+				   .findWithDynamicQuery(dynamicQuery, start, end,
+			orderByComparator);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#update(com.liferay.portal.kernel.model.BaseModel)
+	 */
+	public static Rack update(Rack rack) {
+		return getPersistence().update(rack);
+	}
+
+	/**
+	 * @see com.liferay.portal.kernel.service.persistence.BasePersistence#update(com.liferay.portal.kernel.model.BaseModel, ServiceContext)
+	 */
+	public static Rack update(Rack rack, ServiceContext serviceContext) {
+		return getPersistence().update(rack, serviceContext);
+	}
+
+	/**
+	* Returns all the racks where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the matching racks
+	*/
+	public static List<Rack> findByUuid(java.lang.String uuid) {
+		return getPersistence().findByUuid(uuid);
+	}
+
+	/**
+	* Returns a range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of matching racks
+	*/
+	public static List<Rack> findByUuid(java.lang.String uuid, int start,
+		int end) {
+		return getPersistence().findByUuid(uuid, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching racks
+	*/
+	public static List<Rack> findByUuid(java.lang.String uuid, int start,
+		int end, OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().findByUuid(uuid, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching racks
+	*/
+	public static List<Rack> findByUuid(java.lang.String uuid, int start,
+		int end, OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByUuid(uuid, start, end, orderByComparator,
+			retrieveFromCache);
+	}
+
+	/**
+	* Returns the first rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByUuid_First(java.lang.String uuid,
+		OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().findByUuid_First(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the first rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByUuid_First(java.lang.String uuid,
+		OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().fetchByUuid_First(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the last rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByUuid_Last(java.lang.String uuid,
+		OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().findByUuid_Last(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the last rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByUuid_Last(java.lang.String uuid,
+		OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().fetchByUuid_Last(uuid, orderByComparator);
+	}
+
+	/**
+	* Returns the racks before and after the current rack in the ordered set where uuid = &#63;.
+	*
+	* @param rackId the primary key of the current rack
+	* @param uuid the uuid
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public static Rack[] findByUuid_PrevAndNext(long rackId,
+		java.lang.String uuid, OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence()
+				   .findByUuid_PrevAndNext(rackId, uuid, orderByComparator);
+	}
+
+	/**
+	* Removes all the racks where uuid = &#63; from the database.
+	*
+	* @param uuid the uuid
+	*/
+	public static void removeByUuid(java.lang.String uuid) {
+		getPersistence().removeByUuid(uuid);
+	}
+
+	/**
+	* Returns the number of racks where uuid = &#63;.
+	*
+	* @param uuid the uuid
+	* @return the number of matching racks
+	*/
+	public static int countByUuid(java.lang.String uuid) {
+		return getPersistence().countByUuid(uuid);
+	}
+
+	/**
+	* Returns the rack where uuid = &#63; and groupId = &#63; or throws a {@link NoSuchRackException} if it could not be found.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByUUID_G(java.lang.String uuid, long groupId)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().findByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns the rack where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByUUID_G(java.lang.String uuid, long groupId) {
+		return getPersistence().fetchByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns the rack where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByUUID_G(java.lang.String uuid, long groupId,
+		boolean retrieveFromCache) {
+		return getPersistence().fetchByUUID_G(uuid, groupId, retrieveFromCache);
+	}
+
+	/**
+	* Removes the rack where uuid = &#63; and groupId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the rack that was removed
+	*/
+	public static Rack removeByUUID_G(java.lang.String uuid, long groupId)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().removeByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns the number of racks where uuid = &#63; and groupId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param groupId the group ID
+	* @return the number of matching racks
+	*/
+	public static int countByUUID_G(java.lang.String uuid, long groupId) {
+		return getPersistence().countByUUID_G(uuid, groupId);
+	}
+
+	/**
+	* Returns all the racks where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the matching racks
+	*/
+	public static List<Rack> findByUuid_C(java.lang.String uuid, long companyId) {
+		return getPersistence().findByUuid_C(uuid, companyId);
+	}
+
+	/**
+	* Returns a range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of matching racks
+	*/
+	public static List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end) {
+		return getPersistence().findByUuid_C(uuid, companyId, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching racks
+	*/
+	public static List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Rack> orderByComparator) {
+		return getPersistence()
+				   .findByUuid_C(uuid, companyId, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching racks
+	*/
+	public static List<Rack> findByUuid_C(java.lang.String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Rack> orderByComparator, boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByUuid_C(uuid, companyId, start, end,
+			orderByComparator, retrieveFromCache);
+	}
+
+	/**
+	* Returns the first rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByUuid_C_First(java.lang.String uuid,
+		long companyId, OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence()
+				   .findByUuid_C_First(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the first rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByUuid_C_First(java.lang.String uuid,
+		long companyId, OrderByComparator<Rack> orderByComparator) {
+		return getPersistence()
+				   .fetchByUuid_C_First(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the last rack 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 rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByUuid_C_Last(java.lang.String uuid, long companyId,
+		OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence()
+				   .findByUuid_C_Last(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the last rack 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 rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByUuid_C_Last(java.lang.String uuid,
+		long companyId, OrderByComparator<Rack> orderByComparator) {
+		return getPersistence()
+				   .fetchByUuid_C_Last(uuid, companyId, orderByComparator);
+	}
+
+	/**
+	* Returns the racks before and after the current rack in the ordered set where uuid = &#63; and companyId = &#63;.
+	*
+	* @param rackId the primary key of the current rack
+	* @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 rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public static Rack[] findByUuid_C_PrevAndNext(long rackId,
+		java.lang.String uuid, long companyId,
+		OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence()
+				   .findByUuid_C_PrevAndNext(rackId, uuid, companyId,
+			orderByComparator);
+	}
+
+	/**
+	* Removes all the racks where uuid = &#63; and companyId = &#63; from the database.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	*/
+	public static void removeByUuid_C(java.lang.String uuid, long companyId) {
+		getPersistence().removeByUuid_C(uuid, companyId);
+	}
+
+	/**
+	* Returns the number of racks where uuid = &#63; and companyId = &#63;.
+	*
+	* @param uuid the uuid
+	* @param companyId the company ID
+	* @return the number of matching racks
+	*/
+	public static int countByUuid_C(java.lang.String uuid, long companyId) {
+		return getPersistence().countByUuid_C(uuid, companyId);
+	}
+
+	/**
+	* Returns all the racks where name = &#63;.
+	*
+	* @param name the name
+	* @return the matching racks
+	*/
+	public static List<Rack> findByName(java.lang.String name) {
+		return getPersistence().findByName(name);
+	}
+
+	/**
+	* Returns a range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of matching racks
+	*/
+	public static List<Rack> findByName(java.lang.String name, int start,
+		int end) {
+		return getPersistence().findByName(name, start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of matching racks
+	*/
+	public static List<Rack> findByName(java.lang.String name, int start,
+		int end, OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().findByName(name, start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	* @param start the lower bound of the range of racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of matching racks
+	*/
+	public static List<Rack> findByName(java.lang.String name, int start,
+		int end, OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache) {
+		return getPersistence()
+				   .findByName(name, start, end, orderByComparator,
+			retrieveFromCache);
+	}
+
+	/**
+	* Returns the first rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByName_First(java.lang.String name,
+		OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().findByName_First(name, orderByComparator);
+	}
+
+	/**
+	* Returns the first rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the first matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByName_First(java.lang.String name,
+		OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().fetchByName_First(name, orderByComparator);
+	}
+
+	/**
+	* Returns the last rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching rack
+	* @throws NoSuchRackException if a matching rack could not be found
+	*/
+	public static Rack findByName_Last(java.lang.String name,
+		OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().findByName_Last(name, orderByComparator);
+	}
+
+	/**
+	* Returns the last rack in the ordered set where name = &#63;.
+	*
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the last matching rack, or <code>null</code> if a matching rack could not be found
+	*/
+	public static Rack fetchByName_Last(java.lang.String name,
+		OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().fetchByName_Last(name, orderByComparator);
+	}
+
+	/**
+	* Returns the racks before and after the current rack in the ordered set where name = &#63;.
+	*
+	* @param rackId the primary key of the current rack
+	* @param name the name
+	* @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	* @return the previous, current, and next rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public static Rack[] findByName_PrevAndNext(long rackId,
+		java.lang.String name, OrderByComparator<Rack> orderByComparator)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence()
+				   .findByName_PrevAndNext(rackId, name, orderByComparator);
+	}
+
+	/**
+	* Removes all the racks where name = &#63; from the database.
+	*
+	* @param name the name
+	*/
+	public static void removeByName(java.lang.String name) {
+		getPersistence().removeByName(name);
+	}
+
+	/**
+	* Returns the number of racks where name = &#63;.
+	*
+	* @param name the name
+	* @return the number of matching racks
+	*/
+	public static int countByName(java.lang.String name) {
+		return getPersistence().countByName(name);
+	}
+
+	/**
+	* Caches the rack in the entity cache if it is enabled.
+	*
+	* @param rack the rack
+	*/
+	public static void cacheResult(Rack rack) {
+		getPersistence().cacheResult(rack);
+	}
+
+	/**
+	* Caches the racks in the entity cache if it is enabled.
+	*
+	* @param racks the racks
+	*/
+	public static void cacheResult(List<Rack> racks) {
+		getPersistence().cacheResult(racks);
+	}
+
+	/**
+	* Creates a new rack with the primary key. Does not add the rack to the database.
+	*
+	* @param rackId the primary key for the new rack
+	* @return the new rack
+	*/
+	public static Rack create(long rackId) {
+		return getPersistence().create(rackId);
+	}
+
+	/**
+	* Removes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack that was removed
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public static Rack remove(long rackId)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().remove(rackId);
+	}
+
+	public static Rack updateImpl(Rack rack) {
+		return getPersistence().updateImpl(rack);
+	}
+
+	/**
+	* Returns the rack with the primary key or throws a {@link NoSuchRackException} if it could not be found.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack
+	* @throws NoSuchRackException if a rack with the primary key could not be found
+	*/
+	public static Rack findByPrimaryKey(long rackId)
+		throws fr.ippon.services.embercellar.exception.NoSuchRackException {
+		return getPersistence().findByPrimaryKey(rackId);
+	}
+
+	/**
+	* Returns the rack with the primary key or returns <code>null</code> if it could not be found.
+	*
+	* @param rackId the primary key of the rack
+	* @return the rack, or <code>null</code> if a rack with the primary key could not be found
+	*/
+	public static Rack fetchByPrimaryKey(long rackId) {
+		return getPersistence().fetchByPrimaryKey(rackId);
+	}
+
+	public static java.util.Map<java.io.Serializable, Rack> fetchByPrimaryKeys(
+		java.util.Set<java.io.Serializable> primaryKeys) {
+		return getPersistence().fetchByPrimaryKeys(primaryKeys);
+	}
+
+	/**
+	* Returns all the racks.
+	*
+	* @return the racks
+	*/
+	public static List<Rack> findAll() {
+		return getPersistence().findAll();
+	}
+
+	/**
+	* Returns a range of all the racks.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @return the range of racks
+	*/
+	public static List<Rack> findAll(int start, int end) {
+		return getPersistence().findAll(start, end);
+	}
+
+	/**
+	* Returns an ordered range of all the racks.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @return the ordered range of racks
+	*/
+	public static List<Rack> findAll(int start, int end,
+		OrderByComparator<Rack> orderByComparator) {
+		return getPersistence().findAll(start, end, orderByComparator);
+	}
+
+	/**
+	* Returns an ordered range of all the racks.
+	*
+	* <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	* @param end the upper bound of the range of racks (not inclusive)
+	* @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	* @param retrieveFromCache whether to retrieve from the finder cache
+	* @return the ordered range of racks
+	*/
+	public static List<Rack> findAll(int start, int end,
+		OrderByComparator<Rack> orderByComparator, boolean retrieveFromCache) {
+		return getPersistence()
+				   .findAll(start, end, orderByComparator, retrieveFromCache);
+	}
+
+	/**
+	* Removes all the racks from the database.
+	*/
+	public static void removeAll() {
+		getPersistence().removeAll();
+	}
+
+	/**
+	* Returns the number of racks.
+	*
+	* @return the number of racks
+	*/
+	public static int countAll() {
+		return getPersistence().countAll();
+	}
+
+	public static java.util.Set<java.lang.String> getBadColumnNames() {
+		return getPersistence().getBadColumnNames();
+	}
+
+	public static RackPersistence getPersistence() {
+		return _serviceTracker.getService();
+	}
+
+	private static ServiceTracker<RackPersistence, RackPersistence> _serviceTracker =
+		ServiceTrackerFactory.open(RackPersistence.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/bnd.bnd b/lf7-sdk/modules/embercellar/embercellar-service/bnd.bnd
new file mode 100644
index 0000000000000000000000000000000000000000..a5b0690525c8804dd459edd04b25923d0f1e3d59
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/bnd.bnd
@@ -0,0 +1,5 @@
+Bundle-Name: embercellar-service
+Bundle-SymbolicName: fr.ippon.services.embercellar.service
+Bundle-Version: 1.0.0
+Liferay-Require-SchemaVersion: 1.0.0
+Liferay-Service: true
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/build.gradle b/lf7-sdk/modules/embercellar/embercellar-service/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..d68219a91c39143ca45e6664f7d0f96781d0a77e
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/build.gradle
@@ -0,0 +1,13 @@
+dependencies {
+	compileOnly group: "biz.aQute.bnd", name: "biz.aQute.bndlib", version: "3.1.0"
+	compileOnly group: "com.liferay", name: "com.liferay.osgi.util", version: "3.0.0"
+	compileOnly group: "com.liferay", name: "com.liferay.portal.spring.extender", version: "2.0.0"
+	compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.6.0"
+	compileOnly project(":modules:embercellar:embercellar-api")
+}
+
+buildService {
+	apiDir = "../embercellar-api/src/main/java"
+}
+
+group = "fr.ippon.services.embercellar"
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/service.xml b/lf7-sdk/modules/embercellar/embercellar-service/service.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0351c94563ba7cc058bede37e450b90f78e6eae8
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/service.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 7.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_7_0_0.dtd">
+
+<service-builder package-path="fr.ippon.services.embercellar">
+	<namespace>embercellar</namespace>
+	<!--<entity data-source="sampleDataSource" local-service="true" name="Foo" remote-service="false" session-factory="sampleSessionFactory" table="foo" tx-manager="sampleTransactionManager uuid="true"">-->
+	<entity local-service="true" name="Bottle" remote-service="true" uuid="true">
+
+		<!-- PK fields -->
+
+		<column name="bottleId" primary="true" type="long" />
+
+		<!-- Group instance -->
+
+		<column name="groupId" type="long" />
+
+		<!-- Audit fields -->
+
+		<column name="companyId" type="long" />
+		<column name="userId" type="long" />
+		<column name="userName" type="String" />
+		<column name="createDate" type="Date" />
+		<column name="modifiedDate" type="Date" />
+
+		<!-- Other fields -->
+
+		<column name="name" type="String" />
+		<column name="flipped" type="boolean" />
+		<column name="xcolumn" type="int" />
+		<column name="yrow" type="int" />
+
+		<!-- Just for complying with Ember -->
+
+		<column name="type" type="String" />
+
+		<!-- Relationship -->
+
+		<column name="rackId" type="long" />
+
+		<!-- Order -->
+
+		<order by="asc">
+			<order-column name="name" />
+		</order>
+
+		<!-- Finder methods -->
+
+		<finder name="Name" return-type="Collection">
+			<finder-column name="name" />
+		</finder>
+
+		<finder name="RackId" return-type="Collection">
+			<finder-column name="rackId" />
+		</finder>
+	</entity>
+
+	<entity local-service="true" name="Rack" remote-service="true" uuid="true">
+
+		<!-- PK fields -->
+
+		<column name="rackId" primary="true" type="long" />
+
+		<!-- Group instance -->
+
+		<column name="groupId" type="long" />
+
+		<!-- Audit fields -->
+
+		<column name="companyId" type="long" />
+		<column name="userId" type="long" />
+		<column name="userName" type="String" />
+		<column name="createDate" type="Date" />
+		<column name="modifiedDate" type="Date" />
+
+		<!-- Just for complying with Ember -->
+
+		<column name="type" type="String" />
+
+		<!-- Other fields -->
+
+		<column name="name" type="String" />
+		<column name="nbColumns" type="int" />
+		<column name="nbRows" type="int" />
+		<column name="image" type="String" />
+
+		<!-- Relationship -->
+		<column name="bottles" type="Collection" entity="Bottle" />
+		<column name="bottlesId" type="String" />
+
+		<!-- Order -->
+
+		<order by="asc">
+			<order-column name="name" />
+		</order>
+
+		<!-- Finder methods -->
+
+		<finder name="Name" return-type="Collection">
+			<finder-column name="name" />
+		</finder>
+	</entity>
+</service-builder>
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleBaseImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleBaseImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..38238d2f13c42143361a1908486fe1f49b0bae3d
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleBaseImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.service.BottleLocalServiceUtil;
+
+/**
+ * The extended model base implementation for the Bottle service. Represents a row in the &quot;embercellar_Bottle&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 BottleImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleImpl
+ * @see Bottle
+ * @generated
+ */
+@ProviderType
+public abstract class BottleBaseImpl extends BottleModelImpl implements Bottle {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. All methods that expect a bottle model instance should use the {@link Bottle} interface instead.
+	 */
+	@Override
+	public void persist() {
+		if (this.isNew()) {
+			BottleLocalServiceUtil.addBottle(this);
+		}
+		else {
+			BottleLocalServiceUtil.updateBottle(this);
+		}
+	}
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleCacheModel.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleCacheModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ebbb5ac034e050b5a416ebbb3108d2a11ad3050
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleCacheModel.java
@@ -0,0 +1,256 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.model.CacheModel;
+import com.liferay.portal.kernel.util.HashUtil;
+import com.liferay.portal.kernel.util.StringBundler;
+import com.liferay.portal.kernel.util.StringPool;
+
+import fr.ippon.services.embercellar.model.Bottle;
+
+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 Bottle in entity cache.
+ *
+ * @author Brian Wing Shun Chan
+ * @see Bottle
+ * @generated
+ */
+@ProviderType
+public class BottleCacheModel implements CacheModel<Bottle>, Externalizable {
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof BottleCacheModel)) {
+			return false;
+		}
+
+		BottleCacheModel bottleCacheModel = (BottleCacheModel)obj;
+
+		if (bottleId == bottleCacheModel.bottleId) {
+			return true;
+		}
+
+		return false;
+	}
+
+	@Override
+	public int hashCode() {
+		return HashUtil.hash(0, bottleId);
+	}
+
+	@Override
+	public String toString() {
+		StringBundler sb = new StringBundler(29);
+
+		sb.append("{uuid=");
+		sb.append(uuid);
+		sb.append(", bottleId=");
+		sb.append(bottleId);
+		sb.append(", groupId=");
+		sb.append(groupId);
+		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(", name=");
+		sb.append(name);
+		sb.append(", flipped=");
+		sb.append(flipped);
+		sb.append(", xcolumn=");
+		sb.append(xcolumn);
+		sb.append(", yrow=");
+		sb.append(yrow);
+		sb.append(", type=");
+		sb.append(type);
+		sb.append(", rackId=");
+		sb.append(rackId);
+		sb.append("}");
+
+		return sb.toString();
+	}
+
+	@Override
+	public Bottle toEntityModel() {
+		BottleImpl bottleImpl = new BottleImpl();
+
+		if (uuid == null) {
+			bottleImpl.setUuid(StringPool.BLANK);
+		}
+		else {
+			bottleImpl.setUuid(uuid);
+		}
+
+		bottleImpl.setBottleId(bottleId);
+		bottleImpl.setGroupId(groupId);
+		bottleImpl.setCompanyId(companyId);
+		bottleImpl.setUserId(userId);
+
+		if (userName == null) {
+			bottleImpl.setUserName(StringPool.BLANK);
+		}
+		else {
+			bottleImpl.setUserName(userName);
+		}
+
+		if (createDate == Long.MIN_VALUE) {
+			bottleImpl.setCreateDate(null);
+		}
+		else {
+			bottleImpl.setCreateDate(new Date(createDate));
+		}
+
+		if (modifiedDate == Long.MIN_VALUE) {
+			bottleImpl.setModifiedDate(null);
+		}
+		else {
+			bottleImpl.setModifiedDate(new Date(modifiedDate));
+		}
+
+		if (name == null) {
+			bottleImpl.setName(StringPool.BLANK);
+		}
+		else {
+			bottleImpl.setName(name);
+		}
+
+		bottleImpl.setFlipped(flipped);
+		bottleImpl.setXcolumn(xcolumn);
+		bottleImpl.setYrow(yrow);
+
+		if (type == null) {
+			bottleImpl.setType(StringPool.BLANK);
+		}
+		else {
+			bottleImpl.setType(type);
+		}
+
+		bottleImpl.setRackId(rackId);
+
+		bottleImpl.resetOriginalValues();
+
+		return bottleImpl;
+	}
+
+	@Override
+	public void readExternal(ObjectInput objectInput) throws IOException {
+		uuid = objectInput.readUTF();
+
+		bottleId = objectInput.readLong();
+
+		groupId = objectInput.readLong();
+
+		companyId = objectInput.readLong();
+
+		userId = objectInput.readLong();
+		userName = objectInput.readUTF();
+		createDate = objectInput.readLong();
+		modifiedDate = objectInput.readLong();
+		name = objectInput.readUTF();
+
+		flipped = objectInput.readBoolean();
+
+		xcolumn = objectInput.readInt();
+
+		yrow = objectInput.readInt();
+		type = objectInput.readUTF();
+
+		rackId = objectInput.readLong();
+	}
+
+	@Override
+	public void writeExternal(ObjectOutput objectOutput)
+		throws IOException {
+		if (uuid == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(uuid);
+		}
+
+		objectOutput.writeLong(bottleId);
+
+		objectOutput.writeLong(groupId);
+
+		objectOutput.writeLong(companyId);
+
+		objectOutput.writeLong(userId);
+
+		if (userName == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(userName);
+		}
+
+		objectOutput.writeLong(createDate);
+		objectOutput.writeLong(modifiedDate);
+
+		if (name == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(name);
+		}
+
+		objectOutput.writeBoolean(flipped);
+
+		objectOutput.writeInt(xcolumn);
+
+		objectOutput.writeInt(yrow);
+
+		if (type == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(type);
+		}
+
+		objectOutput.writeLong(rackId);
+	}
+
+	public String uuid;
+	public long bottleId;
+	public long groupId;
+	public long companyId;
+	public long userId;
+	public String userName;
+	public long createDate;
+	public long modifiedDate;
+	public String name;
+	public boolean flipped;
+	public int xcolumn;
+	public int yrow;
+	public String type;
+	public long rackId;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd5b71fffc3bfd1659073848bada3add027528e6
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleImpl.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+/**
+ * The extended model implementation for the Bottle service. Represents a row in the &quot;embercellar_Bottle&quot; database table, with each column mapped to a property of this class.
+ *
+ * <p>
+ * Helper methods and all application logic should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link fr.ippon.services.embercellar.model.Bottle} interface.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ */
+@ProviderType
+public class BottleImpl extends BottleBaseImpl {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never reference this class directly. All methods that expect a bottle model instance should use the {@link fr.ippon.services.embercellar.model.Bottle} interface instead.
+	 */
+	public BottleImpl() {
+	}
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleModelImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleModelImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..209d11174583ee699ef3663170e09a24c31c2654
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/BottleModelImpl.java
@@ -0,0 +1,928 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.expando.kernel.model.ExpandoBridge;
+import com.liferay.expando.kernel.util.ExpandoBridgeFactoryUtil;
+
+import com.liferay.exportimport.kernel.lar.StagedModelType;
+
+import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.json.JSON;
+import com.liferay.portal.kernel.model.CacheModel;
+import com.liferay.portal.kernel.model.User;
+import com.liferay.portal.kernel.model.impl.BaseModelImpl;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.service.UserLocalServiceUtil;
+import com.liferay.portal.kernel.util.GetterUtil;
+import com.liferay.portal.kernel.util.PortalUtil;
+import com.liferay.portal.kernel.util.ProxyUtil;
+import com.liferay.portal.kernel.util.StringBundler;
+import com.liferay.portal.kernel.util.StringPool;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.model.BottleModel;
+import fr.ippon.services.embercellar.model.BottleSoap;
+
+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 Bottle service. Represents a row in the &quot;embercellar_Bottle&quot; database table, with each column mapped to a property of this class.
+ *
+ * <p>
+ * This implementation and its corresponding interface {@link BottleModel} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link BottleImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleImpl
+ * @see Bottle
+ * @see BottleModel
+ * @generated
+ */
+@JSON(strict = true)
+@ProviderType
+public class BottleModelImpl extends BaseModelImpl<Bottle>
+	implements BottleModel {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. All methods that expect a bottle model instance should use the {@link Bottle} interface instead.
+	 */
+	public static final String TABLE_NAME = "embercellar_Bottle";
+	public static final Object[][] TABLE_COLUMNS = {
+			{ "uuid_", Types.VARCHAR },
+			{ "bottleId", Types.BIGINT },
+			{ "groupId", Types.BIGINT },
+			{ "companyId", Types.BIGINT },
+			{ "userId", Types.BIGINT },
+			{ "userName", Types.VARCHAR },
+			{ "createDate", Types.TIMESTAMP },
+			{ "modifiedDate", Types.TIMESTAMP },
+			{ "name", Types.VARCHAR },
+			{ "flipped", Types.BOOLEAN },
+			{ "xcolumn", Types.INTEGER },
+			{ "yrow", Types.INTEGER },
+			{ "type_", Types.VARCHAR },
+			{ "rackId", Types.BIGINT }
+		};
+	public static final Map<String, Integer> TABLE_COLUMNS_MAP = new HashMap<String, Integer>();
+
+	static {
+		TABLE_COLUMNS_MAP.put("uuid_", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("bottleId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("groupId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("companyId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("userId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("userName", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("createDate", Types.TIMESTAMP);
+		TABLE_COLUMNS_MAP.put("modifiedDate", Types.TIMESTAMP);
+		TABLE_COLUMNS_MAP.put("name", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("flipped", Types.BOOLEAN);
+		TABLE_COLUMNS_MAP.put("xcolumn", Types.INTEGER);
+		TABLE_COLUMNS_MAP.put("yrow", Types.INTEGER);
+		TABLE_COLUMNS_MAP.put("type_", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("rackId", Types.BIGINT);
+	}
+
+	public static final String TABLE_SQL_CREATE = "create table embercellar_Bottle (uuid_ VARCHAR(75) null,bottleId LONG not null primary key,groupId LONG,companyId LONG,userId LONG,userName VARCHAR(75) null,createDate DATE null,modifiedDate DATE null,name VARCHAR(75) null,flipped BOOLEAN,xcolumn INTEGER,yrow INTEGER,type_ VARCHAR(75) null,rackId LONG)";
+	public static final String TABLE_SQL_DROP = "drop table embercellar_Bottle";
+	public static final String ORDER_BY_JPQL = " ORDER BY bottle.name ASC";
+	public static final String ORDER_BY_SQL = " ORDER BY embercellar_Bottle.name 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(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"value.object.entity.cache.enabled.fr.ippon.services.embercellar.model.Bottle"),
+			true);
+	public static final boolean FINDER_CACHE_ENABLED = GetterUtil.getBoolean(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"value.object.finder.cache.enabled.fr.ippon.services.embercellar.model.Bottle"),
+			true);
+	public static final boolean COLUMN_BITMASK_ENABLED = GetterUtil.getBoolean(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"value.object.column.bitmask.enabled.fr.ippon.services.embercellar.model.Bottle"),
+			true);
+	public static final long COMPANYID_COLUMN_BITMASK = 1L;
+	public static final long GROUPID_COLUMN_BITMASK = 2L;
+	public static final long NAME_COLUMN_BITMASK = 4L;
+	public static final long RACKID_COLUMN_BITMASK = 8L;
+	public static final long UUID_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 Bottle toModel(BottleSoap soapModel) {
+		if (soapModel == null) {
+			return null;
+		}
+
+		Bottle model = new BottleImpl();
+
+		model.setUuid(soapModel.getUuid());
+		model.setBottleId(soapModel.getBottleId());
+		model.setGroupId(soapModel.getGroupId());
+		model.setCompanyId(soapModel.getCompanyId());
+		model.setUserId(soapModel.getUserId());
+		model.setUserName(soapModel.getUserName());
+		model.setCreateDate(soapModel.getCreateDate());
+		model.setModifiedDate(soapModel.getModifiedDate());
+		model.setName(soapModel.getName());
+		model.setFlipped(soapModel.getFlipped());
+		model.setXcolumn(soapModel.getXcolumn());
+		model.setYrow(soapModel.getYrow());
+		model.setType(soapModel.getType());
+		model.setRackId(soapModel.getRackId());
+
+		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<Bottle> toModels(BottleSoap[] soapModels) {
+		if (soapModels == null) {
+			return null;
+		}
+
+		List<Bottle> models = new ArrayList<Bottle>(soapModels.length);
+
+		for (BottleSoap soapModel : soapModels) {
+			models.add(toModel(soapModel));
+		}
+
+		return models;
+	}
+
+	public static final long LOCK_EXPIRATION_TIME = GetterUtil.getLong(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"lock.expiration.time.fr.ippon.services.embercellar.model.Bottle"));
+
+	public BottleModelImpl() {
+	}
+
+	@Override
+	public long getPrimaryKey() {
+		return _bottleId;
+	}
+
+	@Override
+	public void setPrimaryKey(long primaryKey) {
+		setBottleId(primaryKey);
+	}
+
+	@Override
+	public Serializable getPrimaryKeyObj() {
+		return _bottleId;
+	}
+
+	@Override
+	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
+		setPrimaryKey(((Long)primaryKeyObj).longValue());
+	}
+
+	@Override
+	public Class<?> getModelClass() {
+		return Bottle.class;
+	}
+
+	@Override
+	public String getModelClassName() {
+		return Bottle.class.getName();
+	}
+
+	@Override
+	public Map<String, Object> getModelAttributes() {
+		Map<String, Object> attributes = new HashMap<String, Object>();
+
+		attributes.put("uuid", getUuid());
+		attributes.put("bottleId", getBottleId());
+		attributes.put("groupId", getGroupId());
+		attributes.put("companyId", getCompanyId());
+		attributes.put("userId", getUserId());
+		attributes.put("userName", getUserName());
+		attributes.put("createDate", getCreateDate());
+		attributes.put("modifiedDate", getModifiedDate());
+		attributes.put("name", getName());
+		attributes.put("flipped", getFlipped());
+		attributes.put("xcolumn", getXcolumn());
+		attributes.put("yrow", getYrow());
+		attributes.put("type", getType());
+		attributes.put("rackId", getRackId());
+
+		attributes.put("entityCacheEnabled", isEntityCacheEnabled());
+		attributes.put("finderCacheEnabled", isFinderCacheEnabled());
+
+		return attributes;
+	}
+
+	@Override
+	public void setModelAttributes(Map<String, Object> attributes) {
+		String uuid = (String)attributes.get("uuid");
+
+		if (uuid != null) {
+			setUuid(uuid);
+		}
+
+		Long bottleId = (Long)attributes.get("bottleId");
+
+		if (bottleId != null) {
+			setBottleId(bottleId);
+		}
+
+		Long groupId = (Long)attributes.get("groupId");
+
+		if (groupId != null) {
+			setGroupId(groupId);
+		}
+
+		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);
+		}
+
+		String name = (String)attributes.get("name");
+
+		if (name != null) {
+			setName(name);
+		}
+
+		Boolean flipped = (Boolean)attributes.get("flipped");
+
+		if (flipped != null) {
+			setFlipped(flipped);
+		}
+
+		Integer xcolumn = (Integer)attributes.get("xcolumn");
+
+		if (xcolumn != null) {
+			setXcolumn(xcolumn);
+		}
+
+		Integer yrow = (Integer)attributes.get("yrow");
+
+		if (yrow != null) {
+			setYrow(yrow);
+		}
+
+		String type = (String)attributes.get("type");
+
+		if (type != null) {
+			setType(type);
+		}
+
+		Long rackId = (Long)attributes.get("rackId");
+
+		if (rackId != null) {
+			setRackId(rackId);
+		}
+	}
+
+	@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 getBottleId() {
+		return _bottleId;
+	}
+
+	@Override
+	public void setBottleId(long bottleId) {
+		_bottleId = bottleId;
+	}
+
+	@JSON
+	@Override
+	public long getGroupId() {
+		return _groupId;
+	}
+
+	@Override
+	public void setGroupId(long groupId) {
+		_columnBitmask |= GROUPID_COLUMN_BITMASK;
+
+		if (!_setOriginalGroupId) {
+			_setOriginalGroupId = true;
+
+			_originalGroupId = _groupId;
+		}
+
+		_groupId = groupId;
+	}
+
+	public long getOriginalGroupId() {
+		return _originalGroupId;
+	}
+
+	@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() {
+		try {
+			User user = UserLocalServiceUtil.getUserById(getUserId());
+
+			return user.getUuid();
+		}
+		catch (PortalException pe) {
+			return StringPool.BLANK;
+		}
+	}
+
+	@Override
+	public void setUserUuid(String 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;
+	}
+
+	public boolean hasSetModifiedDate() {
+		return _setModifiedDate;
+	}
+
+	@Override
+	public void setModifiedDate(Date modifiedDate) {
+		_setModifiedDate = true;
+
+		_modifiedDate = modifiedDate;
+	}
+
+	@JSON
+	@Override
+	public String getName() {
+		if (_name == null) {
+			return StringPool.BLANK;
+		}
+		else {
+			return _name;
+		}
+	}
+
+	@Override
+	public void setName(String name) {
+		_columnBitmask = -1L;
+
+		if (_originalName == null) {
+			_originalName = _name;
+		}
+
+		_name = name;
+	}
+
+	public String getOriginalName() {
+		return GetterUtil.getString(_originalName);
+	}
+
+	@JSON
+	@Override
+	public boolean getFlipped() {
+		return _flipped;
+	}
+
+	@JSON
+	@Override
+	public boolean isFlipped() {
+		return _flipped;
+	}
+
+	@Override
+	public void setFlipped(boolean flipped) {
+		_flipped = flipped;
+	}
+
+	@JSON
+	@Override
+	public int getXcolumn() {
+		return _xcolumn;
+	}
+
+	@Override
+	public void setXcolumn(int xcolumn) {
+		_xcolumn = xcolumn;
+	}
+
+	@JSON
+	@Override
+	public int getYrow() {
+		return _yrow;
+	}
+
+	@Override
+	public void setYrow(int yrow) {
+		_yrow = yrow;
+	}
+
+	@JSON
+	@Override
+	public String getType() {
+		if (_type == null) {
+			return StringPool.BLANK;
+		}
+		else {
+			return _type;
+		}
+	}
+
+	@Override
+	public void setType(String type) {
+		_type = type;
+	}
+
+	@JSON
+	@Override
+	public long getRackId() {
+		return _rackId;
+	}
+
+	@Override
+	public void setRackId(long rackId) {
+		_columnBitmask |= RACKID_COLUMN_BITMASK;
+
+		if (!_setOriginalRackId) {
+			_setOriginalRackId = true;
+
+			_originalRackId = _rackId;
+		}
+
+		_rackId = rackId;
+	}
+
+	public long getOriginalRackId() {
+		return _originalRackId;
+	}
+
+	@Override
+	public StagedModelType getStagedModelType() {
+		return new StagedModelType(PortalUtil.getClassNameId(
+				Bottle.class.getName()));
+	}
+
+	public long getColumnBitmask() {
+		return _columnBitmask;
+	}
+
+	@Override
+	public ExpandoBridge getExpandoBridge() {
+		return ExpandoBridgeFactoryUtil.getExpandoBridge(getCompanyId(),
+			Bottle.class.getName(), getPrimaryKey());
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(ServiceContext serviceContext) {
+		ExpandoBridge expandoBridge = getExpandoBridge();
+
+		expandoBridge.setAttributes(serviceContext);
+	}
+
+	@Override
+	public Bottle toEscapedModel() {
+		if (_escapedModel == null) {
+			_escapedModel = (Bottle)ProxyUtil.newProxyInstance(_classLoader,
+					_escapedModelInterfaces, new AutoEscapeBeanHandler(this));
+		}
+
+		return _escapedModel;
+	}
+
+	@Override
+	public Object clone() {
+		BottleImpl bottleImpl = new BottleImpl();
+
+		bottleImpl.setUuid(getUuid());
+		bottleImpl.setBottleId(getBottleId());
+		bottleImpl.setGroupId(getGroupId());
+		bottleImpl.setCompanyId(getCompanyId());
+		bottleImpl.setUserId(getUserId());
+		bottleImpl.setUserName(getUserName());
+		bottleImpl.setCreateDate(getCreateDate());
+		bottleImpl.setModifiedDate(getModifiedDate());
+		bottleImpl.setName(getName());
+		bottleImpl.setFlipped(getFlipped());
+		bottleImpl.setXcolumn(getXcolumn());
+		bottleImpl.setYrow(getYrow());
+		bottleImpl.setType(getType());
+		bottleImpl.setRackId(getRackId());
+
+		bottleImpl.resetOriginalValues();
+
+		return bottleImpl;
+	}
+
+	@Override
+	public int compareTo(Bottle bottle) {
+		int value = 0;
+
+		value = getName().compareTo(bottle.getName());
+
+		if (value != 0) {
+			return value;
+		}
+
+		return 0;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof Bottle)) {
+			return false;
+		}
+
+		Bottle bottle = (Bottle)obj;
+
+		long primaryKey = bottle.getPrimaryKey();
+
+		if (getPrimaryKey() == primaryKey) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+	@Override
+	public int hashCode() {
+		return (int)getPrimaryKey();
+	}
+
+	@Override
+	public boolean isEntityCacheEnabled() {
+		return ENTITY_CACHE_ENABLED;
+	}
+
+	@Override
+	public boolean isFinderCacheEnabled() {
+		return FINDER_CACHE_ENABLED;
+	}
+
+	@Override
+	public void resetOriginalValues() {
+		BottleModelImpl bottleModelImpl = this;
+
+		bottleModelImpl._originalUuid = bottleModelImpl._uuid;
+
+		bottleModelImpl._originalGroupId = bottleModelImpl._groupId;
+
+		bottleModelImpl._setOriginalGroupId = false;
+
+		bottleModelImpl._originalCompanyId = bottleModelImpl._companyId;
+
+		bottleModelImpl._setOriginalCompanyId = false;
+
+		bottleModelImpl._setModifiedDate = false;
+
+		bottleModelImpl._originalName = bottleModelImpl._name;
+
+		bottleModelImpl._originalRackId = bottleModelImpl._rackId;
+
+		bottleModelImpl._setOriginalRackId = false;
+
+		bottleModelImpl._columnBitmask = 0;
+	}
+
+	@Override
+	public CacheModel<Bottle> toCacheModel() {
+		BottleCacheModel bottleCacheModel = new BottleCacheModel();
+
+		bottleCacheModel.uuid = getUuid();
+
+		String uuid = bottleCacheModel.uuid;
+
+		if ((uuid != null) && (uuid.length() == 0)) {
+			bottleCacheModel.uuid = null;
+		}
+
+		bottleCacheModel.bottleId = getBottleId();
+
+		bottleCacheModel.groupId = getGroupId();
+
+		bottleCacheModel.companyId = getCompanyId();
+
+		bottleCacheModel.userId = getUserId();
+
+		bottleCacheModel.userName = getUserName();
+
+		String userName = bottleCacheModel.userName;
+
+		if ((userName != null) && (userName.length() == 0)) {
+			bottleCacheModel.userName = null;
+		}
+
+		Date createDate = getCreateDate();
+
+		if (createDate != null) {
+			bottleCacheModel.createDate = createDate.getTime();
+		}
+		else {
+			bottleCacheModel.createDate = Long.MIN_VALUE;
+		}
+
+		Date modifiedDate = getModifiedDate();
+
+		if (modifiedDate != null) {
+			bottleCacheModel.modifiedDate = modifiedDate.getTime();
+		}
+		else {
+			bottleCacheModel.modifiedDate = Long.MIN_VALUE;
+		}
+
+		bottleCacheModel.name = getName();
+
+		String name = bottleCacheModel.name;
+
+		if ((name != null) && (name.length() == 0)) {
+			bottleCacheModel.name = null;
+		}
+
+		bottleCacheModel.flipped = getFlipped();
+
+		bottleCacheModel.xcolumn = getXcolumn();
+
+		bottleCacheModel.yrow = getYrow();
+
+		bottleCacheModel.type = getType();
+
+		String type = bottleCacheModel.type;
+
+		if ((type != null) && (type.length() == 0)) {
+			bottleCacheModel.type = null;
+		}
+
+		bottleCacheModel.rackId = getRackId();
+
+		return bottleCacheModel;
+	}
+
+	@Override
+	public String toString() {
+		StringBundler sb = new StringBundler(29);
+
+		sb.append("{uuid=");
+		sb.append(getUuid());
+		sb.append(", bottleId=");
+		sb.append(getBottleId());
+		sb.append(", groupId=");
+		sb.append(getGroupId());
+		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(", name=");
+		sb.append(getName());
+		sb.append(", flipped=");
+		sb.append(getFlipped());
+		sb.append(", xcolumn=");
+		sb.append(getXcolumn());
+		sb.append(", yrow=");
+		sb.append(getYrow());
+		sb.append(", type=");
+		sb.append(getType());
+		sb.append(", rackId=");
+		sb.append(getRackId());
+		sb.append("}");
+
+		return sb.toString();
+	}
+
+	@Override
+	public String toXmlString() {
+		StringBundler sb = new StringBundler(46);
+
+		sb.append("<model><model-name>");
+		sb.append("fr.ippon.services.embercellar.model.Bottle");
+		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>bottleId</column-name><column-value><![CDATA[");
+		sb.append(getBottleId());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>groupId</column-name><column-value><![CDATA[");
+		sb.append(getGroupId());
+		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>name</column-name><column-value><![CDATA[");
+		sb.append(getName());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>flipped</column-name><column-value><![CDATA[");
+		sb.append(getFlipped());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>xcolumn</column-name><column-value><![CDATA[");
+		sb.append(getXcolumn());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>yrow</column-name><column-value><![CDATA[");
+		sb.append(getYrow());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>type</column-name><column-value><![CDATA[");
+		sb.append(getType());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>rackId</column-name><column-value><![CDATA[");
+		sb.append(getRackId());
+		sb.append("]]></column-value></column>");
+
+		sb.append("</model>");
+
+		return sb.toString();
+	}
+
+	private static final ClassLoader _classLoader = Bottle.class.getClassLoader();
+	private static final Class<?>[] _escapedModelInterfaces = new Class[] {
+			Bottle.class
+		};
+	private String _uuid;
+	private String _originalUuid;
+	private long _bottleId;
+	private long _groupId;
+	private long _originalGroupId;
+	private boolean _setOriginalGroupId;
+	private long _companyId;
+	private long _originalCompanyId;
+	private boolean _setOriginalCompanyId;
+	private long _userId;
+	private String _userName;
+	private Date _createDate;
+	private Date _modifiedDate;
+	private boolean _setModifiedDate;
+	private String _name;
+	private String _originalName;
+	private boolean _flipped;
+	private int _xcolumn;
+	private int _yrow;
+	private String _type;
+	private long _rackId;
+	private long _originalRackId;
+	private boolean _setOriginalRackId;
+	private long _columnBitmask;
+	private Bottle _escapedModel;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackBaseImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackBaseImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..60aefb071a864b12f7f8294a6e28ddec0f9c710b
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackBaseImpl.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.service.RackLocalServiceUtil;
+
+/**
+ * The extended model base implementation for the Rack service. Represents a row in the &quot;embercellar_Rack&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 RackImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackImpl
+ * @see Rack
+ * @generated
+ */
+@ProviderType
+public abstract class RackBaseImpl extends RackModelImpl implements Rack {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. All methods that expect a rack model instance should use the {@link Rack} interface instead.
+	 */
+	@Override
+	public void persist() {
+		if (this.isNew()) {
+			RackLocalServiceUtil.addRack(this);
+		}
+		else {
+			RackLocalServiceUtil.updateRack(this);
+		}
+	}
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackCacheModel.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackCacheModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..a92e8b79c7b0f88ae8af362c14664b834842a127
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackCacheModel.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.model.CacheModel;
+import com.liferay.portal.kernel.util.HashUtil;
+import com.liferay.portal.kernel.util.StringBundler;
+import com.liferay.portal.kernel.util.StringPool;
+
+import fr.ippon.services.embercellar.model.Rack;
+
+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 Rack in entity cache.
+ *
+ * @author Brian Wing Shun Chan
+ * @see Rack
+ * @generated
+ */
+@ProviderType
+public class RackCacheModel implements CacheModel<Rack>, Externalizable {
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof RackCacheModel)) {
+			return false;
+		}
+
+		RackCacheModel rackCacheModel = (RackCacheModel)obj;
+
+		if (rackId == rackCacheModel.rackId) {
+			return true;
+		}
+
+		return false;
+	}
+
+	@Override
+	public int hashCode() {
+		return HashUtil.hash(0, rackId);
+	}
+
+	@Override
+	public String toString() {
+		StringBundler sb = new StringBundler(29);
+
+		sb.append("{uuid=");
+		sb.append(uuid);
+		sb.append(", rackId=");
+		sb.append(rackId);
+		sb.append(", groupId=");
+		sb.append(groupId);
+		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(", type=");
+		sb.append(type);
+		sb.append(", name=");
+		sb.append(name);
+		sb.append(", nbColumns=");
+		sb.append(nbColumns);
+		sb.append(", nbRows=");
+		sb.append(nbRows);
+		sb.append(", image=");
+		sb.append(image);
+		sb.append(", bottlesId=");
+		sb.append(bottlesId);
+		sb.append("}");
+
+		return sb.toString();
+	}
+
+	@Override
+	public Rack toEntityModel() {
+		RackImpl rackImpl = new RackImpl();
+
+		if (uuid == null) {
+			rackImpl.setUuid(StringPool.BLANK);
+		}
+		else {
+			rackImpl.setUuid(uuid);
+		}
+
+		rackImpl.setRackId(rackId);
+		rackImpl.setGroupId(groupId);
+		rackImpl.setCompanyId(companyId);
+		rackImpl.setUserId(userId);
+
+		if (userName == null) {
+			rackImpl.setUserName(StringPool.BLANK);
+		}
+		else {
+			rackImpl.setUserName(userName);
+		}
+
+		if (createDate == Long.MIN_VALUE) {
+			rackImpl.setCreateDate(null);
+		}
+		else {
+			rackImpl.setCreateDate(new Date(createDate));
+		}
+
+		if (modifiedDate == Long.MIN_VALUE) {
+			rackImpl.setModifiedDate(null);
+		}
+		else {
+			rackImpl.setModifiedDate(new Date(modifiedDate));
+		}
+
+		if (type == null) {
+			rackImpl.setType(StringPool.BLANK);
+		}
+		else {
+			rackImpl.setType(type);
+		}
+
+		if (name == null) {
+			rackImpl.setName(StringPool.BLANK);
+		}
+		else {
+			rackImpl.setName(name);
+		}
+
+		rackImpl.setNbColumns(nbColumns);
+		rackImpl.setNbRows(nbRows);
+
+		if (image == null) {
+			rackImpl.setImage(StringPool.BLANK);
+		}
+		else {
+			rackImpl.setImage(image);
+		}
+
+		if (bottlesId == null) {
+			rackImpl.setBottlesId(StringPool.BLANK);
+		}
+		else {
+			rackImpl.setBottlesId(bottlesId);
+		}
+
+		rackImpl.resetOriginalValues();
+
+		return rackImpl;
+	}
+
+	@Override
+	public void readExternal(ObjectInput objectInput) throws IOException {
+		uuid = objectInput.readUTF();
+
+		rackId = objectInput.readLong();
+
+		groupId = objectInput.readLong();
+
+		companyId = objectInput.readLong();
+
+		userId = objectInput.readLong();
+		userName = objectInput.readUTF();
+		createDate = objectInput.readLong();
+		modifiedDate = objectInput.readLong();
+		type = objectInput.readUTF();
+		name = objectInput.readUTF();
+
+		nbColumns = objectInput.readInt();
+
+		nbRows = objectInput.readInt();
+		image = objectInput.readUTF();
+		bottlesId = objectInput.readUTF();
+	}
+
+	@Override
+	public void writeExternal(ObjectOutput objectOutput)
+		throws IOException {
+		if (uuid == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(uuid);
+		}
+
+		objectOutput.writeLong(rackId);
+
+		objectOutput.writeLong(groupId);
+
+		objectOutput.writeLong(companyId);
+
+		objectOutput.writeLong(userId);
+
+		if (userName == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(userName);
+		}
+
+		objectOutput.writeLong(createDate);
+		objectOutput.writeLong(modifiedDate);
+
+		if (type == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(type);
+		}
+
+		if (name == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(name);
+		}
+
+		objectOutput.writeInt(nbColumns);
+
+		objectOutput.writeInt(nbRows);
+
+		if (image == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(image);
+		}
+
+		if (bottlesId == null) {
+			objectOutput.writeUTF(StringPool.BLANK);
+		}
+		else {
+			objectOutput.writeUTF(bottlesId);
+		}
+	}
+
+	public String uuid;
+	public long rackId;
+	public long groupId;
+	public long companyId;
+	public long userId;
+	public String userName;
+	public long createDate;
+	public long modifiedDate;
+	public String type;
+	public String name;
+	public int nbColumns;
+	public int nbRows;
+	public String image;
+	public String bottlesId;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a45b309483b766585f82a11b8ade3009e4ce3cb
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackImpl.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+/**
+ * The extended model implementation for the Rack service. Represents a row in the &quot;embercellar_Rack&quot; database table, with each column mapped to a property of this class.
+ *
+ * <p>
+ * Helper methods and all application logic should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link fr.ippon.services.embercellar.model.Rack} interface.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ */
+@ProviderType
+public class RackImpl extends RackBaseImpl {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never reference this class directly. All methods that expect a rack model instance should use the {@link fr.ippon.services.embercellar.model.Rack} interface instead.
+	 */
+	public RackImpl() {
+	}
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackModelImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackModelImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff70443a3b872bb333332af059154950a8ff1e73
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/model/impl/RackModelImpl.java
@@ -0,0 +1,924 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.model.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.expando.kernel.model.ExpandoBridge;
+import com.liferay.expando.kernel.util.ExpandoBridgeFactoryUtil;
+
+import com.liferay.exportimport.kernel.lar.StagedModelType;
+
+import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.json.JSON;
+import com.liferay.portal.kernel.model.CacheModel;
+import com.liferay.portal.kernel.model.User;
+import com.liferay.portal.kernel.model.impl.BaseModelImpl;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.service.UserLocalServiceUtil;
+import com.liferay.portal.kernel.util.GetterUtil;
+import com.liferay.portal.kernel.util.PortalUtil;
+import com.liferay.portal.kernel.util.ProxyUtil;
+import com.liferay.portal.kernel.util.StringBundler;
+import com.liferay.portal.kernel.util.StringPool;
+
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.model.RackModel;
+import fr.ippon.services.embercellar.model.RackSoap;
+
+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 Rack service. Represents a row in the &quot;embercellar_Rack&quot; database table, with each column mapped to a property of this class.
+ *
+ * <p>
+ * This implementation and its corresponding interface {@link RackModel} exist only as a container for the default property accessors generated by ServiceBuilder. Helper methods and all application logic should be put in {@link RackImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackImpl
+ * @see Rack
+ * @see RackModel
+ * @generated
+ */
+@JSON(strict = true)
+@ProviderType
+public class RackModelImpl extends BaseModelImpl<Rack> implements RackModel {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. All methods that expect a rack model instance should use the {@link Rack} interface instead.
+	 */
+	public static final String TABLE_NAME = "embercellar_Rack";
+	public static final Object[][] TABLE_COLUMNS = {
+			{ "uuid_", Types.VARCHAR },
+			{ "rackId", Types.BIGINT },
+			{ "groupId", Types.BIGINT },
+			{ "companyId", Types.BIGINT },
+			{ "userId", Types.BIGINT },
+			{ "userName", Types.VARCHAR },
+			{ "createDate", Types.TIMESTAMP },
+			{ "modifiedDate", Types.TIMESTAMP },
+			{ "type_", Types.VARCHAR },
+			{ "name", Types.VARCHAR },
+			{ "nbColumns", Types.INTEGER },
+			{ "nbRows", Types.INTEGER },
+			{ "image", Types.VARCHAR },
+			{ "bottlesId", Types.VARCHAR }
+		};
+	public static final Map<String, Integer> TABLE_COLUMNS_MAP = new HashMap<String, Integer>();
+
+	static {
+		TABLE_COLUMNS_MAP.put("uuid_", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("rackId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("groupId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("companyId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("userId", Types.BIGINT);
+		TABLE_COLUMNS_MAP.put("userName", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("createDate", Types.TIMESTAMP);
+		TABLE_COLUMNS_MAP.put("modifiedDate", Types.TIMESTAMP);
+		TABLE_COLUMNS_MAP.put("type_", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("name", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("nbColumns", Types.INTEGER);
+		TABLE_COLUMNS_MAP.put("nbRows", Types.INTEGER);
+		TABLE_COLUMNS_MAP.put("image", Types.VARCHAR);
+		TABLE_COLUMNS_MAP.put("bottlesId", Types.VARCHAR);
+	}
+
+	public static final String TABLE_SQL_CREATE = "create table embercellar_Rack (uuid_ VARCHAR(75) null,rackId LONG not null primary key,groupId LONG,companyId LONG,userId LONG,userName VARCHAR(75) null,createDate DATE null,modifiedDate DATE null,type_ VARCHAR(75) null,name VARCHAR(75) null,nbColumns INTEGER,nbRows INTEGER,image VARCHAR(75) null,bottlesId VARCHAR(75) null)";
+	public static final String TABLE_SQL_DROP = "drop table embercellar_Rack";
+	public static final String ORDER_BY_JPQL = " ORDER BY rack.name ASC";
+	public static final String ORDER_BY_SQL = " ORDER BY embercellar_Rack.name 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(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"value.object.entity.cache.enabled.fr.ippon.services.embercellar.model.Rack"),
+			true);
+	public static final boolean FINDER_CACHE_ENABLED = GetterUtil.getBoolean(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"value.object.finder.cache.enabled.fr.ippon.services.embercellar.model.Rack"),
+			true);
+	public static final boolean COLUMN_BITMASK_ENABLED = GetterUtil.getBoolean(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"value.object.column.bitmask.enabled.fr.ippon.services.embercellar.model.Rack"),
+			true);
+	public static final long COMPANYID_COLUMN_BITMASK = 1L;
+	public static final long GROUPID_COLUMN_BITMASK = 2L;
+	public static final long NAME_COLUMN_BITMASK = 4L;
+	public static final long UUID_COLUMN_BITMASK = 8L;
+
+	/**
+	 * 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 Rack toModel(RackSoap soapModel) {
+		if (soapModel == null) {
+			return null;
+		}
+
+		Rack model = new RackImpl();
+
+		model.setUuid(soapModel.getUuid());
+		model.setRackId(soapModel.getRackId());
+		model.setGroupId(soapModel.getGroupId());
+		model.setCompanyId(soapModel.getCompanyId());
+		model.setUserId(soapModel.getUserId());
+		model.setUserName(soapModel.getUserName());
+		model.setCreateDate(soapModel.getCreateDate());
+		model.setModifiedDate(soapModel.getModifiedDate());
+		model.setType(soapModel.getType());
+		model.setName(soapModel.getName());
+		model.setNbColumns(soapModel.getNbColumns());
+		model.setNbRows(soapModel.getNbRows());
+		model.setImage(soapModel.getImage());
+		model.setBottlesId(soapModel.getBottlesId());
+
+		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<Rack> toModels(RackSoap[] soapModels) {
+		if (soapModels == null) {
+			return null;
+		}
+
+		List<Rack> models = new ArrayList<Rack>(soapModels.length);
+
+		for (RackSoap soapModel : soapModels) {
+			models.add(toModel(soapModel));
+		}
+
+		return models;
+	}
+
+	public static final long LOCK_EXPIRATION_TIME = GetterUtil.getLong(fr.ippon.services.embercellar.service.util.ServiceProps.get(
+				"lock.expiration.time.fr.ippon.services.embercellar.model.Rack"));
+
+	public RackModelImpl() {
+	}
+
+	@Override
+	public long getPrimaryKey() {
+		return _rackId;
+	}
+
+	@Override
+	public void setPrimaryKey(long primaryKey) {
+		setRackId(primaryKey);
+	}
+
+	@Override
+	public Serializable getPrimaryKeyObj() {
+		return _rackId;
+	}
+
+	@Override
+	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
+		setPrimaryKey(((Long)primaryKeyObj).longValue());
+	}
+
+	@Override
+	public Class<?> getModelClass() {
+		return Rack.class;
+	}
+
+	@Override
+	public String getModelClassName() {
+		return Rack.class.getName();
+	}
+
+	@Override
+	public Map<String, Object> getModelAttributes() {
+		Map<String, Object> attributes = new HashMap<String, Object>();
+
+		attributes.put("uuid", getUuid());
+		attributes.put("rackId", getRackId());
+		attributes.put("groupId", getGroupId());
+		attributes.put("companyId", getCompanyId());
+		attributes.put("userId", getUserId());
+		attributes.put("userName", getUserName());
+		attributes.put("createDate", getCreateDate());
+		attributes.put("modifiedDate", getModifiedDate());
+		attributes.put("type", getType());
+		attributes.put("name", getName());
+		attributes.put("nbColumns", getNbColumns());
+		attributes.put("nbRows", getNbRows());
+		attributes.put("image", getImage());
+		attributes.put("bottlesId", getBottlesId());
+
+		attributes.put("entityCacheEnabled", isEntityCacheEnabled());
+		attributes.put("finderCacheEnabled", isFinderCacheEnabled());
+
+		return attributes;
+	}
+
+	@Override
+	public void setModelAttributes(Map<String, Object> attributes) {
+		String uuid = (String)attributes.get("uuid");
+
+		if (uuid != null) {
+			setUuid(uuid);
+		}
+
+		Long rackId = (Long)attributes.get("rackId");
+
+		if (rackId != null) {
+			setRackId(rackId);
+		}
+
+		Long groupId = (Long)attributes.get("groupId");
+
+		if (groupId != null) {
+			setGroupId(groupId);
+		}
+
+		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);
+		}
+
+		String type = (String)attributes.get("type");
+
+		if (type != null) {
+			setType(type);
+		}
+
+		String name = (String)attributes.get("name");
+
+		if (name != null) {
+			setName(name);
+		}
+
+		Integer nbColumns = (Integer)attributes.get("nbColumns");
+
+		if (nbColumns != null) {
+			setNbColumns(nbColumns);
+		}
+
+		Integer nbRows = (Integer)attributes.get("nbRows");
+
+		if (nbRows != null) {
+			setNbRows(nbRows);
+		}
+
+		String image = (String)attributes.get("image");
+
+		if (image != null) {
+			setImage(image);
+		}
+
+		String bottlesId = (String)attributes.get("bottlesId");
+
+		if (bottlesId != null) {
+			setBottlesId(bottlesId);
+		}
+	}
+
+	@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 getRackId() {
+		return _rackId;
+	}
+
+	@Override
+	public void setRackId(long rackId) {
+		_rackId = rackId;
+	}
+
+	@JSON
+	@Override
+	public long getGroupId() {
+		return _groupId;
+	}
+
+	@Override
+	public void setGroupId(long groupId) {
+		_columnBitmask |= GROUPID_COLUMN_BITMASK;
+
+		if (!_setOriginalGroupId) {
+			_setOriginalGroupId = true;
+
+			_originalGroupId = _groupId;
+		}
+
+		_groupId = groupId;
+	}
+
+	public long getOriginalGroupId() {
+		return _originalGroupId;
+	}
+
+	@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() {
+		try {
+			User user = UserLocalServiceUtil.getUserById(getUserId());
+
+			return user.getUuid();
+		}
+		catch (PortalException pe) {
+			return StringPool.BLANK;
+		}
+	}
+
+	@Override
+	public void setUserUuid(String 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;
+	}
+
+	public boolean hasSetModifiedDate() {
+		return _setModifiedDate;
+	}
+
+	@Override
+	public void setModifiedDate(Date modifiedDate) {
+		_setModifiedDate = true;
+
+		_modifiedDate = modifiedDate;
+	}
+
+	@JSON
+	@Override
+	public String getType() {
+		if (_type == null) {
+			return StringPool.BLANK;
+		}
+		else {
+			return _type;
+		}
+	}
+
+	@Override
+	public void setType(String type) {
+		_type = type;
+	}
+
+	@JSON
+	@Override
+	public String getName() {
+		if (_name == null) {
+			return StringPool.BLANK;
+		}
+		else {
+			return _name;
+		}
+	}
+
+	@Override
+	public void setName(String name) {
+		_columnBitmask = -1L;
+
+		if (_originalName == null) {
+			_originalName = _name;
+		}
+
+		_name = name;
+	}
+
+	public String getOriginalName() {
+		return GetterUtil.getString(_originalName);
+	}
+
+	@JSON
+	@Override
+	public int getNbColumns() {
+		return _nbColumns;
+	}
+
+	@Override
+	public void setNbColumns(int nbColumns) {
+		_nbColumns = nbColumns;
+	}
+
+	@JSON
+	@Override
+	public int getNbRows() {
+		return _nbRows;
+	}
+
+	@Override
+	public void setNbRows(int nbRows) {
+		_nbRows = nbRows;
+	}
+
+	@JSON
+	@Override
+	public String getImage() {
+		if (_image == null) {
+			return StringPool.BLANK;
+		}
+		else {
+			return _image;
+		}
+	}
+
+	@Override
+	public void setImage(String image) {
+		_image = image;
+	}
+
+	@JSON
+	@Override
+	public String getBottlesId() {
+		if (_bottlesId == null) {
+			return StringPool.BLANK;
+		}
+		else {
+			return _bottlesId;
+		}
+	}
+
+	@Override
+	public void setBottlesId(String bottlesId) {
+		_bottlesId = bottlesId;
+	}
+
+	@Override
+	public StagedModelType getStagedModelType() {
+		return new StagedModelType(PortalUtil.getClassNameId(
+				Rack.class.getName()));
+	}
+
+	public long getColumnBitmask() {
+		return _columnBitmask;
+	}
+
+	@Override
+	public ExpandoBridge getExpandoBridge() {
+		return ExpandoBridgeFactoryUtil.getExpandoBridge(getCompanyId(),
+			Rack.class.getName(), getPrimaryKey());
+	}
+
+	@Override
+	public void setExpandoBridgeAttributes(ServiceContext serviceContext) {
+		ExpandoBridge expandoBridge = getExpandoBridge();
+
+		expandoBridge.setAttributes(serviceContext);
+	}
+
+	@Override
+	public Rack toEscapedModel() {
+		if (_escapedModel == null) {
+			_escapedModel = (Rack)ProxyUtil.newProxyInstance(_classLoader,
+					_escapedModelInterfaces, new AutoEscapeBeanHandler(this));
+		}
+
+		return _escapedModel;
+	}
+
+	@Override
+	public Object clone() {
+		RackImpl rackImpl = new RackImpl();
+
+		rackImpl.setUuid(getUuid());
+		rackImpl.setRackId(getRackId());
+		rackImpl.setGroupId(getGroupId());
+		rackImpl.setCompanyId(getCompanyId());
+		rackImpl.setUserId(getUserId());
+		rackImpl.setUserName(getUserName());
+		rackImpl.setCreateDate(getCreateDate());
+		rackImpl.setModifiedDate(getModifiedDate());
+		rackImpl.setType(getType());
+		rackImpl.setName(getName());
+		rackImpl.setNbColumns(getNbColumns());
+		rackImpl.setNbRows(getNbRows());
+		rackImpl.setImage(getImage());
+		rackImpl.setBottlesId(getBottlesId());
+
+		rackImpl.resetOriginalValues();
+
+		return rackImpl;
+	}
+
+	@Override
+	public int compareTo(Rack rack) {
+		int value = 0;
+
+		value = getName().compareTo(rack.getName());
+
+		if (value != 0) {
+			return value;
+		}
+
+		return 0;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+
+		if (!(obj instanceof Rack)) {
+			return false;
+		}
+
+		Rack rack = (Rack)obj;
+
+		long primaryKey = rack.getPrimaryKey();
+
+		if (getPrimaryKey() == primaryKey) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+	@Override
+	public int hashCode() {
+		return (int)getPrimaryKey();
+	}
+
+	@Override
+	public boolean isEntityCacheEnabled() {
+		return ENTITY_CACHE_ENABLED;
+	}
+
+	@Override
+	public boolean isFinderCacheEnabled() {
+		return FINDER_CACHE_ENABLED;
+	}
+
+	@Override
+	public void resetOriginalValues() {
+		RackModelImpl rackModelImpl = this;
+
+		rackModelImpl._originalUuid = rackModelImpl._uuid;
+
+		rackModelImpl._originalGroupId = rackModelImpl._groupId;
+
+		rackModelImpl._setOriginalGroupId = false;
+
+		rackModelImpl._originalCompanyId = rackModelImpl._companyId;
+
+		rackModelImpl._setOriginalCompanyId = false;
+
+		rackModelImpl._setModifiedDate = false;
+
+		rackModelImpl._originalName = rackModelImpl._name;
+
+		rackModelImpl._columnBitmask = 0;
+	}
+
+	@Override
+	public CacheModel<Rack> toCacheModel() {
+		RackCacheModel rackCacheModel = new RackCacheModel();
+
+		rackCacheModel.uuid = getUuid();
+
+		String uuid = rackCacheModel.uuid;
+
+		if ((uuid != null) && (uuid.length() == 0)) {
+			rackCacheModel.uuid = null;
+		}
+
+		rackCacheModel.rackId = getRackId();
+
+		rackCacheModel.groupId = getGroupId();
+
+		rackCacheModel.companyId = getCompanyId();
+
+		rackCacheModel.userId = getUserId();
+
+		rackCacheModel.userName = getUserName();
+
+		String userName = rackCacheModel.userName;
+
+		if ((userName != null) && (userName.length() == 0)) {
+			rackCacheModel.userName = null;
+		}
+
+		Date createDate = getCreateDate();
+
+		if (createDate != null) {
+			rackCacheModel.createDate = createDate.getTime();
+		}
+		else {
+			rackCacheModel.createDate = Long.MIN_VALUE;
+		}
+
+		Date modifiedDate = getModifiedDate();
+
+		if (modifiedDate != null) {
+			rackCacheModel.modifiedDate = modifiedDate.getTime();
+		}
+		else {
+			rackCacheModel.modifiedDate = Long.MIN_VALUE;
+		}
+
+		rackCacheModel.type = getType();
+
+		String type = rackCacheModel.type;
+
+		if ((type != null) && (type.length() == 0)) {
+			rackCacheModel.type = null;
+		}
+
+		rackCacheModel.name = getName();
+
+		String name = rackCacheModel.name;
+
+		if ((name != null) && (name.length() == 0)) {
+			rackCacheModel.name = null;
+		}
+
+		rackCacheModel.nbColumns = getNbColumns();
+
+		rackCacheModel.nbRows = getNbRows();
+
+		rackCacheModel.image = getImage();
+
+		String image = rackCacheModel.image;
+
+		if ((image != null) && (image.length() == 0)) {
+			rackCacheModel.image = null;
+		}
+
+		rackCacheModel.bottlesId = getBottlesId();
+
+		String bottlesId = rackCacheModel.bottlesId;
+
+		if ((bottlesId != null) && (bottlesId.length() == 0)) {
+			rackCacheModel.bottlesId = null;
+		}
+
+		return rackCacheModel;
+	}
+
+	@Override
+	public String toString() {
+		StringBundler sb = new StringBundler(29);
+
+		sb.append("{uuid=");
+		sb.append(getUuid());
+		sb.append(", rackId=");
+		sb.append(getRackId());
+		sb.append(", groupId=");
+		sb.append(getGroupId());
+		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(", type=");
+		sb.append(getType());
+		sb.append(", name=");
+		sb.append(getName());
+		sb.append(", nbColumns=");
+		sb.append(getNbColumns());
+		sb.append(", nbRows=");
+		sb.append(getNbRows());
+		sb.append(", image=");
+		sb.append(getImage());
+		sb.append(", bottlesId=");
+		sb.append(getBottlesId());
+		sb.append("}");
+
+		return sb.toString();
+	}
+
+	@Override
+	public String toXmlString() {
+		StringBundler sb = new StringBundler(46);
+
+		sb.append("<model><model-name>");
+		sb.append("fr.ippon.services.embercellar.model.Rack");
+		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>rackId</column-name><column-value><![CDATA[");
+		sb.append(getRackId());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>groupId</column-name><column-value><![CDATA[");
+		sb.append(getGroupId());
+		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>type</column-name><column-value><![CDATA[");
+		sb.append(getType());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>name</column-name><column-value><![CDATA[");
+		sb.append(getName());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>nbColumns</column-name><column-value><![CDATA[");
+		sb.append(getNbColumns());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>nbRows</column-name><column-value><![CDATA[");
+		sb.append(getNbRows());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>image</column-name><column-value><![CDATA[");
+		sb.append(getImage());
+		sb.append("]]></column-value></column>");
+		sb.append(
+			"<column><column-name>bottlesId</column-name><column-value><![CDATA[");
+		sb.append(getBottlesId());
+		sb.append("]]></column-value></column>");
+
+		sb.append("</model>");
+
+		return sb.toString();
+	}
+
+	private static final ClassLoader _classLoader = Rack.class.getClassLoader();
+	private static final Class<?>[] _escapedModelInterfaces = new Class[] {
+			Rack.class
+		};
+	private String _uuid;
+	private String _originalUuid;
+	private long _rackId;
+	private long _groupId;
+	private long _originalGroupId;
+	private boolean _setOriginalGroupId;
+	private long _companyId;
+	private long _originalCompanyId;
+	private boolean _setOriginalCompanyId;
+	private long _userId;
+	private String _userName;
+	private Date _createDate;
+	private Date _modifiedDate;
+	private boolean _setModifiedDate;
+	private String _type;
+	private String _name;
+	private String _originalName;
+	private int _nbColumns;
+	private int _nbRows;
+	private String _image;
+	private String _bottlesId;
+	private long _columnBitmask;
+	private Rack _escapedModel;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/BottleLocalServiceBaseImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/BottleLocalServiceBaseImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a941b270945a655895b8b820f9153734db6182f
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/BottleLocalServiceBaseImpl.java
@@ -0,0 +1,686 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.base;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.exportimport.kernel.lar.ExportImportHelperUtil;
+import com.liferay.exportimport.kernel.lar.ManifestSummary;
+import com.liferay.exportimport.kernel.lar.PortletDataContext;
+import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil;
+import com.liferay.exportimport.kernel.lar.StagedModelType;
+
+import com.liferay.portal.kernel.bean.BeanReference;
+import com.liferay.portal.kernel.dao.db.DB;
+import com.liferay.portal.kernel.dao.db.DBManagerUtil;
+import com.liferay.portal.kernel.dao.jdbc.SqlUpdate;
+import com.liferay.portal.kernel.dao.jdbc.SqlUpdateFactoryUtil;
+import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DefaultActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
+import com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery;
+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.model.PersistedModel;
+import com.liferay.portal.kernel.module.framework.service.IdentifiableOSGiService;
+import com.liferay.portal.kernel.search.Indexable;
+import com.liferay.portal.kernel.search.IndexableType;
+import com.liferay.portal.kernel.service.BaseLocalServiceImpl;
+import com.liferay.portal.kernel.service.PersistedModelLocalServiceRegistry;
+import com.liferay.portal.kernel.service.persistence.ClassNamePersistence;
+import com.liferay.portal.kernel.service.persistence.UserPersistence;
+import com.liferay.portal.kernel.util.OrderByComparator;
+import com.liferay.portal.kernel.util.PortalUtil;
+import com.liferay.portal.spring.extender.service.ServiceReference;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.service.BottleLocalService;
+import fr.ippon.services.embercellar.service.persistence.BottlePersistence;
+import fr.ippon.services.embercellar.service.persistence.RackPersistence;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.sql.DataSource;
+
+/**
+ * Provides the base implementation for the bottle 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 fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl
+ * @see fr.ippon.services.embercellar.service.BottleLocalServiceUtil
+ * @generated
+ */
+@ProviderType
+public abstract class BottleLocalServiceBaseImpl extends BaseLocalServiceImpl
+	implements BottleLocalService, IdentifiableOSGiService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleLocalServiceUtil} to access the bottle local service.
+	 */
+
+	/**
+	 * Adds the bottle to the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param bottle the bottle
+	 * @return the bottle that was added
+	 */
+	@Indexable(type = IndexableType.REINDEX)
+	@Override
+	public Bottle addBottle(Bottle bottle) {
+		bottle.setNew(true);
+
+		return bottlePersistence.update(bottle);
+	}
+
+	/**
+	 * Creates a new bottle with the primary key. Does not add the bottle to the database.
+	 *
+	 * @param bottleId the primary key for the new bottle
+	 * @return the new bottle
+	 */
+	@Override
+	public Bottle createBottle(long bottleId) {
+		return bottlePersistence.create(bottleId);
+	}
+
+	/**
+	 * Deletes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param bottleId the primary key of the bottle
+	 * @return the bottle that was removed
+	 * @throws PortalException if a bottle with the primary key could not be found
+	 */
+	@Indexable(type = IndexableType.DELETE)
+	@Override
+	public Bottle deleteBottle(long bottleId) throws PortalException {
+		return bottlePersistence.remove(bottleId);
+	}
+
+	/**
+	 * Deletes the bottle from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param bottle the bottle
+	 * @return the bottle that was removed
+	 */
+	@Indexable(type = IndexableType.DELETE)
+	@Override
+	public Bottle deleteBottle(Bottle bottle) {
+		return bottlePersistence.remove(bottle);
+	}
+
+	@Override
+	public DynamicQuery dynamicQuery() {
+		Class<?> clazz = getClass();
+
+		return DynamicQueryFactoryUtil.forClass(Bottle.class,
+			clazz.getClassLoader());
+	}
+
+	/**
+	 * Performs a dynamic query on the database and returns the matching rows.
+	 *
+	 * @param dynamicQuery the dynamic query
+	 * @return the matching rows
+	 */
+	@Override
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery) {
+		return bottlePersistence.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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	 */
+	@Override
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int end) {
+		return bottlePersistence.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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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
+	 */
+	@Override
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int end, OrderByComparator<T> orderByComparator) {
+		return bottlePersistence.findWithDynamicQuery(dynamicQuery, start, end,
+			orderByComparator);
+	}
+
+	/**
+	 * Returns the number of rows matching the dynamic query.
+	 *
+	 * @param dynamicQuery the dynamic query
+	 * @return the number of rows matching the dynamic query
+	 */
+	@Override
+	public long dynamicQueryCount(DynamicQuery dynamicQuery) {
+		return bottlePersistence.countWithDynamicQuery(dynamicQuery);
+	}
+
+	/**
+	 * Returns the number of rows matching the dynamic query.
+	 *
+	 * @param dynamicQuery the dynamic query
+	 * @param projection the projection to apply to the query
+	 * @return the number of rows matching the dynamic query
+	 */
+	@Override
+	public long dynamicQueryCount(DynamicQuery dynamicQuery,
+		Projection projection) {
+		return bottlePersistence.countWithDynamicQuery(dynamicQuery, projection);
+	}
+
+	@Override
+	public Bottle fetchBottle(long bottleId) {
+		return bottlePersistence.fetchByPrimaryKey(bottleId);
+	}
+
+	/**
+	 * Returns the bottle matching the UUID and group.
+	 *
+	 * @param uuid the bottle's UUID
+	 * @param groupId the primary key of the group
+	 * @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchBottleByUuidAndGroupId(String uuid, long groupId) {
+		return bottlePersistence.fetchByUUID_G(uuid, groupId);
+	}
+
+	/**
+	 * Returns the bottle with the primary key.
+	 *
+	 * @param bottleId the primary key of the bottle
+	 * @return the bottle
+	 * @throws PortalException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle getBottle(long bottleId) throws PortalException {
+		return bottlePersistence.findByPrimaryKey(bottleId);
+	}
+
+	@Override
+	public ActionableDynamicQuery getActionableDynamicQuery() {
+		ActionableDynamicQuery actionableDynamicQuery = new DefaultActionableDynamicQuery();
+
+		actionableDynamicQuery.setBaseLocalService(bottleLocalService);
+		actionableDynamicQuery.setClassLoader(getClassLoader());
+		actionableDynamicQuery.setModelClass(Bottle.class);
+
+		actionableDynamicQuery.setPrimaryKeyPropertyName("bottleId");
+
+		return actionableDynamicQuery;
+	}
+
+	@Override
+	public IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() {
+		IndexableActionableDynamicQuery indexableActionableDynamicQuery = new IndexableActionableDynamicQuery();
+
+		indexableActionableDynamicQuery.setBaseLocalService(bottleLocalService);
+		indexableActionableDynamicQuery.setClassLoader(getClassLoader());
+		indexableActionableDynamicQuery.setModelClass(Bottle.class);
+
+		indexableActionableDynamicQuery.setPrimaryKeyPropertyName("bottleId");
+
+		return indexableActionableDynamicQuery;
+	}
+
+	protected void initActionableDynamicQuery(
+		ActionableDynamicQuery actionableDynamicQuery) {
+		actionableDynamicQuery.setBaseLocalService(bottleLocalService);
+		actionableDynamicQuery.setClassLoader(getClassLoader());
+		actionableDynamicQuery.setModelClass(Bottle.class);
+
+		actionableDynamicQuery.setPrimaryKeyPropertyName("bottleId");
+	}
+
+	@Override
+	public ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		final PortletDataContext portletDataContext) {
+		final ExportActionableDynamicQuery exportActionableDynamicQuery = new ExportActionableDynamicQuery() {
+				@Override
+				public long performCount() throws PortalException {
+					ManifestSummary manifestSummary = portletDataContext.getManifestSummary();
+
+					StagedModelType stagedModelType = getStagedModelType();
+
+					long modelAdditionCount = super.performCount();
+
+					manifestSummary.addModelAdditionCount(stagedModelType,
+						modelAdditionCount);
+
+					long modelDeletionCount = ExportImportHelperUtil.getModelDeletionCount(portletDataContext,
+							stagedModelType);
+
+					manifestSummary.addModelDeletionCount(stagedModelType,
+						modelDeletionCount);
+
+					return modelAdditionCount;
+				}
+			};
+
+		initActionableDynamicQuery(exportActionableDynamicQuery);
+
+		exportActionableDynamicQuery.setAddCriteriaMethod(new ActionableDynamicQuery.AddCriteriaMethod() {
+				@Override
+				public void addCriteria(DynamicQuery dynamicQuery) {
+					portletDataContext.addDateRangeCriteria(dynamicQuery,
+						"modifiedDate");
+				}
+			});
+
+		exportActionableDynamicQuery.setCompanyId(portletDataContext.getCompanyId());
+
+		exportActionableDynamicQuery.setPerformActionMethod(new ActionableDynamicQuery.PerformActionMethod<Bottle>() {
+				@Override
+				public void performAction(Bottle bottle)
+					throws PortalException {
+					StagedModelDataHandlerUtil.exportStagedModel(portletDataContext,
+						bottle);
+				}
+			});
+		exportActionableDynamicQuery.setStagedModelType(new StagedModelType(
+				PortalUtil.getClassNameId(Bottle.class.getName())));
+
+		return exportActionableDynamicQuery;
+	}
+
+	/**
+	 * @throws PortalException
+	 */
+	@Override
+	public PersistedModel deletePersistedModel(PersistedModel persistedModel)
+		throws PortalException {
+		return bottleLocalService.deleteBottle((Bottle)persistedModel);
+	}
+
+	@Override
+	public PersistedModel getPersistedModel(Serializable primaryKeyObj)
+		throws PortalException {
+		return bottlePersistence.findByPrimaryKey(primaryKeyObj);
+	}
+
+	/**
+	 * Returns all the bottles matching the UUID and company.
+	 *
+	 * @param uuid the UUID of the bottles
+	 * @param companyId the primary key of the company
+	 * @return the matching bottles, or an empty list if no matches were found
+	 */
+	@Override
+	public List<Bottle> getBottlesByUuidAndCompanyId(String uuid, long companyId) {
+		return bottlePersistence.findByUuid_C(uuid, companyId);
+	}
+
+	/**
+	 * Returns a range of bottles matching the UUID and company.
+	 *
+	 * @param uuid the UUID of the bottles
+	 * @param companyId the primary key of the company
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the range of matching bottles, or an empty list if no matches were found
+	 */
+	@Override
+	public List<Bottle> getBottlesByUuidAndCompanyId(String uuid,
+		long companyId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return bottlePersistence.findByUuid_C(uuid, companyId, start, end,
+			orderByComparator);
+	}
+
+	/**
+	 * Returns the bottle matching the UUID and group.
+	 *
+	 * @param uuid the bottle's UUID
+	 * @param groupId the primary key of the group
+	 * @return the matching bottle
+	 * @throws PortalException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle getBottleByUuidAndGroupId(String uuid, long groupId)
+		throws PortalException {
+		return bottlePersistence.findByUUID_G(uuid, groupId);
+	}
+
+	/**
+	 * Returns a range of all the bottles.
+	 *
+	 * <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 fr.ippon.services.embercellar.model.impl.BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @return the range of bottles
+	 */
+	@Override
+	public List<Bottle> getBottles(int start, int end) {
+		return bottlePersistence.findAll(start, end);
+	}
+
+	/**
+	 * Returns the number of bottles.
+	 *
+	 * @return the number of bottles
+	 */
+	@Override
+	public int getBottlesCount() {
+		return bottlePersistence.countAll();
+	}
+
+	/**
+	 * Updates the bottle in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	 *
+	 * @param bottle the bottle
+	 * @return the bottle that was updated
+	 */
+	@Indexable(type = IndexableType.REINDEX)
+	@Override
+	public Bottle updateBottle(Bottle bottle) {
+		return bottlePersistence.update(bottle);
+	}
+
+	/**
+	 * Returns the bottle local service.
+	 *
+	 * @return the bottle local service
+	 */
+	public BottleLocalService getBottleLocalService() {
+		return bottleLocalService;
+	}
+
+	/**
+	 * Sets the bottle local service.
+	 *
+	 * @param bottleLocalService the bottle local service
+	 */
+	public void setBottleLocalService(BottleLocalService bottleLocalService) {
+		this.bottleLocalService = bottleLocalService;
+	}
+
+	/**
+	 * Returns the bottle persistence.
+	 *
+	 * @return the bottle persistence
+	 */
+	public BottlePersistence getBottlePersistence() {
+		return bottlePersistence;
+	}
+
+	/**
+	 * Sets the bottle persistence.
+	 *
+	 * @param bottlePersistence the bottle persistence
+	 */
+	public void setBottlePersistence(BottlePersistence bottlePersistence) {
+		this.bottlePersistence = bottlePersistence;
+	}
+
+	/**
+	 * Returns the rack local service.
+	 *
+	 * @return the rack local service
+	 */
+	public fr.ippon.services.embercellar.service.RackLocalService getRackLocalService() {
+		return rackLocalService;
+	}
+
+	/**
+	 * Sets the rack local service.
+	 *
+	 * @param rackLocalService the rack local service
+	 */
+	public void setRackLocalService(
+		fr.ippon.services.embercellar.service.RackLocalService rackLocalService) {
+		this.rackLocalService = rackLocalService;
+	}
+
+	/**
+	 * Returns the rack persistence.
+	 *
+	 * @return the rack persistence
+	 */
+	public RackPersistence getRackPersistence() {
+		return rackPersistence;
+	}
+
+	/**
+	 * Sets the rack persistence.
+	 *
+	 * @param rackPersistence the rack persistence
+	 */
+	public void setRackPersistence(RackPersistence rackPersistence) {
+		this.rackPersistence = rackPersistence;
+	}
+
+	/**
+	 * Returns the counter local service.
+	 *
+	 * @return the counter local service
+	 */
+	public com.liferay.counter.kernel.service.CounterLocalService getCounterLocalService() {
+		return counterLocalService;
+	}
+
+	/**
+	 * Sets the counter local service.
+	 *
+	 * @param counterLocalService the counter local service
+	 */
+	public void setCounterLocalService(
+		com.liferay.counter.kernel.service.CounterLocalService counterLocalService) {
+		this.counterLocalService = counterLocalService;
+	}
+
+	/**
+	 * Returns the class name local service.
+	 *
+	 * @return the class name local service
+	 */
+	public com.liferay.portal.kernel.service.ClassNameLocalService getClassNameLocalService() {
+		return classNameLocalService;
+	}
+
+	/**
+	 * Sets the class name local service.
+	 *
+	 * @param classNameLocalService the class name local service
+	 */
+	public void setClassNameLocalService(
+		com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService) {
+		this.classNameLocalService = classNameLocalService;
+	}
+
+	/**
+	 * Returns the class name persistence.
+	 *
+	 * @return the class name persistence
+	 */
+	public ClassNamePersistence getClassNamePersistence() {
+		return classNamePersistence;
+	}
+
+	/**
+	 * Sets the class name persistence.
+	 *
+	 * @param classNamePersistence the class name persistence
+	 */
+	public void setClassNamePersistence(
+		ClassNamePersistence classNamePersistence) {
+		this.classNamePersistence = classNamePersistence;
+	}
+
+	/**
+	 * Returns the resource local service.
+	 *
+	 * @return the resource local service
+	 */
+	public com.liferay.portal.kernel.service.ResourceLocalService getResourceLocalService() {
+		return resourceLocalService;
+	}
+
+	/**
+	 * Sets the resource local service.
+	 *
+	 * @param resourceLocalService the resource local service
+	 */
+	public void setResourceLocalService(
+		com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService) {
+		this.resourceLocalService = resourceLocalService;
+	}
+
+	/**
+	 * Returns the user local service.
+	 *
+	 * @return the user local service
+	 */
+	public com.liferay.portal.kernel.service.UserLocalService getUserLocalService() {
+		return userLocalService;
+	}
+
+	/**
+	 * Sets the user local service.
+	 *
+	 * @param userLocalService the user local service
+	 */
+	public void setUserLocalService(
+		com.liferay.portal.kernel.service.UserLocalService userLocalService) {
+		this.userLocalService = userLocalService;
+	}
+
+	/**
+	 * 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() {
+		persistedModelLocalServiceRegistry.register("fr.ippon.services.embercellar.model.Bottle",
+			bottleLocalService);
+	}
+
+	public void destroy() {
+		persistedModelLocalServiceRegistry.unregister(
+			"fr.ippon.services.embercellar.model.Bottle");
+	}
+
+	/**
+	 * Returns the OSGi service identifier.
+	 *
+	 * @return the OSGi service identifier
+	 */
+	@Override
+	public String getOSGiServiceIdentifier() {
+		return BottleLocalService.class.getName();
+	}
+
+	protected Class<?> getModelClass() {
+		return Bottle.class;
+	}
+
+	protected String getModelClassName() {
+		return Bottle.class.getName();
+	}
+
+	/**
+	 * Performs a SQL query.
+	 *
+	 * @param sql the sql query
+	 */
+	protected void runSQL(String sql) {
+		try {
+			DataSource dataSource = bottlePersistence.getDataSource();
+
+			DB db = DBManagerUtil.getDB();
+
+			sql = db.buildSQL(sql);
+			sql = PortalUtil.transformSQL(sql);
+
+			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
+					sql);
+
+			sqlUpdate.update();
+		}
+		catch (Exception e) {
+			throw new SystemException(e);
+		}
+	}
+
+	@BeanReference(type = BottleLocalService.class)
+	protected BottleLocalService bottleLocalService;
+	@BeanReference(type = BottlePersistence.class)
+	protected BottlePersistence bottlePersistence;
+	@BeanReference(type = fr.ippon.services.embercellar.service.RackLocalService.class)
+	protected fr.ippon.services.embercellar.service.RackLocalService rackLocalService;
+	@BeanReference(type = RackPersistence.class)
+	protected RackPersistence rackPersistence;
+	@ServiceReference(type = com.liferay.counter.kernel.service.CounterLocalService.class)
+	protected com.liferay.counter.kernel.service.CounterLocalService counterLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ClassNameLocalService.class)
+	protected com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService;
+	@ServiceReference(type = ClassNamePersistence.class)
+	protected ClassNamePersistence classNamePersistence;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ResourceLocalService.class)
+	protected com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.UserLocalService.class)
+	protected com.liferay.portal.kernel.service.UserLocalService userLocalService;
+	@ServiceReference(type = UserPersistence.class)
+	protected UserPersistence userPersistence;
+	@ServiceReference(type = PersistedModelLocalServiceRegistry.class)
+	protected PersistedModelLocalServiceRegistry persistedModelLocalServiceRegistry;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/BottleServiceBaseImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/BottleServiceBaseImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ab2a45aeaa4efba1015a57d26067ecd0831f455
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/BottleServiceBaseImpl.java
@@ -0,0 +1,395 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.base;
+
+import com.liferay.portal.kernel.bean.BeanReference;
+import com.liferay.portal.kernel.dao.db.DB;
+import com.liferay.portal.kernel.dao.db.DBManagerUtil;
+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.kernel.module.framework.service.IdentifiableOSGiService;
+import com.liferay.portal.kernel.service.BaseServiceImpl;
+import com.liferay.portal.kernel.service.persistence.ClassNamePersistence;
+import com.liferay.portal.kernel.service.persistence.UserPersistence;
+import com.liferay.portal.kernel.util.PortalUtil;
+import com.liferay.portal.spring.extender.service.ServiceReference;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.service.BottleService;
+import fr.ippon.services.embercellar.service.persistence.BottlePersistence;
+import fr.ippon.services.embercellar.service.persistence.RackPersistence;
+
+import javax.sql.DataSource;
+
+/**
+ * Provides the base implementation for the bottle 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 fr.ippon.services.embercellar.service.impl.BottleServiceImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.impl.BottleServiceImpl
+ * @see fr.ippon.services.embercellar.service.BottleServiceUtil
+ * @generated
+ */
+public abstract class BottleServiceBaseImpl extends BaseServiceImpl
+	implements BottleService, IdentifiableOSGiService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleServiceUtil} to access the bottle remote service.
+	 */
+
+	/**
+	 * Returns the bottle local service.
+	 *
+	 * @return the bottle local service
+	 */
+	public fr.ippon.services.embercellar.service.BottleLocalService getBottleLocalService() {
+		return bottleLocalService;
+	}
+
+	/**
+	 * Sets the bottle local service.
+	 *
+	 * @param bottleLocalService the bottle local service
+	 */
+	public void setBottleLocalService(
+		fr.ippon.services.embercellar.service.BottleLocalService bottleLocalService) {
+		this.bottleLocalService = bottleLocalService;
+	}
+
+	/**
+	 * Returns the bottle remote service.
+	 *
+	 * @return the bottle remote service
+	 */
+	public BottleService getBottleService() {
+		return bottleService;
+	}
+
+	/**
+	 * Sets the bottle remote service.
+	 *
+	 * @param bottleService the bottle remote service
+	 */
+	public void setBottleService(BottleService bottleService) {
+		this.bottleService = bottleService;
+	}
+
+	/**
+	 * Returns the bottle persistence.
+	 *
+	 * @return the bottle persistence
+	 */
+	public BottlePersistence getBottlePersistence() {
+		return bottlePersistence;
+	}
+
+	/**
+	 * Sets the bottle persistence.
+	 *
+	 * @param bottlePersistence the bottle persistence
+	 */
+	public void setBottlePersistence(BottlePersistence bottlePersistence) {
+		this.bottlePersistence = bottlePersistence;
+	}
+
+	/**
+	 * Returns the rack local service.
+	 *
+	 * @return the rack local service
+	 */
+	public fr.ippon.services.embercellar.service.RackLocalService getRackLocalService() {
+		return rackLocalService;
+	}
+
+	/**
+	 * Sets the rack local service.
+	 *
+	 * @param rackLocalService the rack local service
+	 */
+	public void setRackLocalService(
+		fr.ippon.services.embercellar.service.RackLocalService rackLocalService) {
+		this.rackLocalService = rackLocalService;
+	}
+
+	/**
+	 * Returns the rack remote service.
+	 *
+	 * @return the rack remote service
+	 */
+	public fr.ippon.services.embercellar.service.RackService getRackService() {
+		return rackService;
+	}
+
+	/**
+	 * Sets the rack remote service.
+	 *
+	 * @param rackService the rack remote service
+	 */
+	public void setRackService(
+		fr.ippon.services.embercellar.service.RackService rackService) {
+		this.rackService = rackService;
+	}
+
+	/**
+	 * Returns the rack persistence.
+	 *
+	 * @return the rack persistence
+	 */
+	public RackPersistence getRackPersistence() {
+		return rackPersistence;
+	}
+
+	/**
+	 * Sets the rack persistence.
+	 *
+	 * @param rackPersistence the rack persistence
+	 */
+	public void setRackPersistence(RackPersistence rackPersistence) {
+		this.rackPersistence = rackPersistence;
+	}
+
+	/**
+	 * Returns the counter local service.
+	 *
+	 * @return the counter local service
+	 */
+	public com.liferay.counter.kernel.service.CounterLocalService getCounterLocalService() {
+		return counterLocalService;
+	}
+
+	/**
+	 * Sets the counter local service.
+	 *
+	 * @param counterLocalService the counter local service
+	 */
+	public void setCounterLocalService(
+		com.liferay.counter.kernel.service.CounterLocalService counterLocalService) {
+		this.counterLocalService = counterLocalService;
+	}
+
+	/**
+	 * Returns the class name local service.
+	 *
+	 * @return the class name local service
+	 */
+	public com.liferay.portal.kernel.service.ClassNameLocalService getClassNameLocalService() {
+		return classNameLocalService;
+	}
+
+	/**
+	 * Sets the class name local service.
+	 *
+	 * @param classNameLocalService the class name local service
+	 */
+	public void setClassNameLocalService(
+		com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService) {
+		this.classNameLocalService = classNameLocalService;
+	}
+
+	/**
+	 * Returns the class name remote service.
+	 *
+	 * @return the class name remote service
+	 */
+	public com.liferay.portal.kernel.service.ClassNameService getClassNameService() {
+		return classNameService;
+	}
+
+	/**
+	 * Sets the class name remote service.
+	 *
+	 * @param classNameService the class name remote service
+	 */
+	public void setClassNameService(
+		com.liferay.portal.kernel.service.ClassNameService classNameService) {
+		this.classNameService = classNameService;
+	}
+
+	/**
+	 * Returns the class name persistence.
+	 *
+	 * @return the class name persistence
+	 */
+	public ClassNamePersistence getClassNamePersistence() {
+		return classNamePersistence;
+	}
+
+	/**
+	 * Sets the class name persistence.
+	 *
+	 * @param classNamePersistence the class name persistence
+	 */
+	public void setClassNamePersistence(
+		ClassNamePersistence classNamePersistence) {
+		this.classNamePersistence = classNamePersistence;
+	}
+
+	/**
+	 * Returns the resource local service.
+	 *
+	 * @return the resource local service
+	 */
+	public com.liferay.portal.kernel.service.ResourceLocalService getResourceLocalService() {
+		return resourceLocalService;
+	}
+
+	/**
+	 * Sets the resource local service.
+	 *
+	 * @param resourceLocalService the resource local service
+	 */
+	public void setResourceLocalService(
+		com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService) {
+		this.resourceLocalService = resourceLocalService;
+	}
+
+	/**
+	 * Returns the user local service.
+	 *
+	 * @return the user local service
+	 */
+	public com.liferay.portal.kernel.service.UserLocalService getUserLocalService() {
+		return userLocalService;
+	}
+
+	/**
+	 * Sets the user local service.
+	 *
+	 * @param userLocalService the user local service
+	 */
+	public void setUserLocalService(
+		com.liferay.portal.kernel.service.UserLocalService userLocalService) {
+		this.userLocalService = userLocalService;
+	}
+
+	/**
+	 * Returns the user remote service.
+	 *
+	 * @return the user remote service
+	 */
+	public com.liferay.portal.kernel.service.UserService getUserService() {
+		return userService;
+	}
+
+	/**
+	 * Sets the user remote service.
+	 *
+	 * @param userService the user remote service
+	 */
+	public void setUserService(
+		com.liferay.portal.kernel.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() {
+	}
+
+	public void destroy() {
+	}
+
+	/**
+	 * Returns the OSGi service identifier.
+	 *
+	 * @return the OSGi service identifier
+	 */
+	@Override
+	public String getOSGiServiceIdentifier() {
+		return BottleService.class.getName();
+	}
+
+	protected Class<?> getModelClass() {
+		return Bottle.class;
+	}
+
+	protected String getModelClassName() {
+		return Bottle.class.getName();
+	}
+
+	/**
+	 * Performs a SQL query.
+	 *
+	 * @param sql the sql query
+	 */
+	protected void runSQL(String sql) {
+		try {
+			DataSource dataSource = bottlePersistence.getDataSource();
+
+			DB db = DBManagerUtil.getDB();
+
+			sql = db.buildSQL(sql);
+			sql = PortalUtil.transformSQL(sql);
+
+			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
+					sql);
+
+			sqlUpdate.update();
+		}
+		catch (Exception e) {
+			throw new SystemException(e);
+		}
+	}
+
+	@BeanReference(type = fr.ippon.services.embercellar.service.BottleLocalService.class)
+	protected fr.ippon.services.embercellar.service.BottleLocalService bottleLocalService;
+	@BeanReference(type = BottleService.class)
+	protected BottleService bottleService;
+	@BeanReference(type = BottlePersistence.class)
+	protected BottlePersistence bottlePersistence;
+	@BeanReference(type = fr.ippon.services.embercellar.service.RackLocalService.class)
+	protected fr.ippon.services.embercellar.service.RackLocalService rackLocalService;
+	@BeanReference(type = fr.ippon.services.embercellar.service.RackService.class)
+	protected fr.ippon.services.embercellar.service.RackService rackService;
+	@BeanReference(type = RackPersistence.class)
+	protected RackPersistence rackPersistence;
+	@ServiceReference(type = com.liferay.counter.kernel.service.CounterLocalService.class)
+	protected com.liferay.counter.kernel.service.CounterLocalService counterLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ClassNameLocalService.class)
+	protected com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ClassNameService.class)
+	protected com.liferay.portal.kernel.service.ClassNameService classNameService;
+	@ServiceReference(type = ClassNamePersistence.class)
+	protected ClassNamePersistence classNamePersistence;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ResourceLocalService.class)
+	protected com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.UserLocalService.class)
+	protected com.liferay.portal.kernel.service.UserLocalService userLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.UserService.class)
+	protected com.liferay.portal.kernel.service.UserService userService;
+	@ServiceReference(type = UserPersistence.class)
+	protected UserPersistence userPersistence;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/RackLocalServiceBaseImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/RackLocalServiceBaseImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4c862f751c94b5b5975ba0d0cd1028361b1dcbe
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/RackLocalServiceBaseImpl.java
@@ -0,0 +1,684 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.base;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.exportimport.kernel.lar.ExportImportHelperUtil;
+import com.liferay.exportimport.kernel.lar.ManifestSummary;
+import com.liferay.exportimport.kernel.lar.PortletDataContext;
+import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil;
+import com.liferay.exportimport.kernel.lar.StagedModelType;
+
+import com.liferay.portal.kernel.bean.BeanReference;
+import com.liferay.portal.kernel.dao.db.DB;
+import com.liferay.portal.kernel.dao.db.DBManagerUtil;
+import com.liferay.portal.kernel.dao.jdbc.SqlUpdate;
+import com.liferay.portal.kernel.dao.jdbc.SqlUpdateFactoryUtil;
+import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DefaultActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
+import com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery;
+import com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery;
+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.model.PersistedModel;
+import com.liferay.portal.kernel.module.framework.service.IdentifiableOSGiService;
+import com.liferay.portal.kernel.search.Indexable;
+import com.liferay.portal.kernel.search.IndexableType;
+import com.liferay.portal.kernel.service.BaseLocalServiceImpl;
+import com.liferay.portal.kernel.service.PersistedModelLocalServiceRegistry;
+import com.liferay.portal.kernel.service.persistence.ClassNamePersistence;
+import com.liferay.portal.kernel.service.persistence.UserPersistence;
+import com.liferay.portal.kernel.util.OrderByComparator;
+import com.liferay.portal.kernel.util.PortalUtil;
+import com.liferay.portal.spring.extender.service.ServiceReference;
+
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.service.RackLocalService;
+import fr.ippon.services.embercellar.service.persistence.BottlePersistence;
+import fr.ippon.services.embercellar.service.persistence.RackPersistence;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import javax.sql.DataSource;
+
+/**
+ * Provides the base implementation for the rack 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 fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl
+ * @see fr.ippon.services.embercellar.service.RackLocalServiceUtil
+ * @generated
+ */
+@ProviderType
+public abstract class RackLocalServiceBaseImpl extends BaseLocalServiceImpl
+	implements RackLocalService, IdentifiableOSGiService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackLocalServiceUtil} to access the rack local service.
+	 */
+
+	/**
+	 * Adds the rack to the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param rack the rack
+	 * @return the rack that was added
+	 */
+	@Indexable(type = IndexableType.REINDEX)
+	@Override
+	public Rack addRack(Rack rack) {
+		rack.setNew(true);
+
+		return rackPersistence.update(rack);
+	}
+
+	/**
+	 * Creates a new rack with the primary key. Does not add the rack to the database.
+	 *
+	 * @param rackId the primary key for the new rack
+	 * @return the new rack
+	 */
+	@Override
+	public Rack createRack(long rackId) {
+		return rackPersistence.create(rackId);
+	}
+
+	/**
+	 * Deletes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param rackId the primary key of the rack
+	 * @return the rack that was removed
+	 * @throws PortalException if a rack with the primary key could not be found
+	 */
+	@Indexable(type = IndexableType.DELETE)
+	@Override
+	public Rack deleteRack(long rackId) throws PortalException {
+		return rackPersistence.remove(rackId);
+	}
+
+	/**
+	 * Deletes the rack from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param rack the rack
+	 * @return the rack that was removed
+	 */
+	@Indexable(type = IndexableType.DELETE)
+	@Override
+	public Rack deleteRack(Rack rack) {
+		return rackPersistence.remove(rack);
+	}
+
+	@Override
+	public DynamicQuery dynamicQuery() {
+		Class<?> clazz = getClass();
+
+		return DynamicQueryFactoryUtil.forClass(Rack.class,
+			clazz.getClassLoader());
+	}
+
+	/**
+	 * Performs a dynamic query on the database and returns the matching rows.
+	 *
+	 * @param dynamicQuery the dynamic query
+	 * @return the matching rows
+	 */
+	@Override
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery) {
+		return rackPersistence.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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	 */
+	@Override
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int end) {
+		return rackPersistence.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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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
+	 */
+	@Override
+	public <T> List<T> dynamicQuery(DynamicQuery dynamicQuery, int start,
+		int end, OrderByComparator<T> orderByComparator) {
+		return rackPersistence.findWithDynamicQuery(dynamicQuery, start, end,
+			orderByComparator);
+	}
+
+	/**
+	 * Returns the number of rows matching the dynamic query.
+	 *
+	 * @param dynamicQuery the dynamic query
+	 * @return the number of rows matching the dynamic query
+	 */
+	@Override
+	public long dynamicQueryCount(DynamicQuery dynamicQuery) {
+		return rackPersistence.countWithDynamicQuery(dynamicQuery);
+	}
+
+	/**
+	 * Returns the number of rows matching the dynamic query.
+	 *
+	 * @param dynamicQuery the dynamic query
+	 * @param projection the projection to apply to the query
+	 * @return the number of rows matching the dynamic query
+	 */
+	@Override
+	public long dynamicQueryCount(DynamicQuery dynamicQuery,
+		Projection projection) {
+		return rackPersistence.countWithDynamicQuery(dynamicQuery, projection);
+	}
+
+	@Override
+	public Rack fetchRack(long rackId) {
+		return rackPersistence.fetchByPrimaryKey(rackId);
+	}
+
+	/**
+	 * Returns the rack matching the UUID and group.
+	 *
+	 * @param uuid the rack's UUID
+	 * @param groupId the primary key of the group
+	 * @return the matching rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchRackByUuidAndGroupId(String uuid, long groupId) {
+		return rackPersistence.fetchByUUID_G(uuid, groupId);
+	}
+
+	/**
+	 * Returns the rack with the primary key.
+	 *
+	 * @param rackId the primary key of the rack
+	 * @return the rack
+	 * @throws PortalException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack getRack(long rackId) throws PortalException {
+		return rackPersistence.findByPrimaryKey(rackId);
+	}
+
+	@Override
+	public ActionableDynamicQuery getActionableDynamicQuery() {
+		ActionableDynamicQuery actionableDynamicQuery = new DefaultActionableDynamicQuery();
+
+		actionableDynamicQuery.setBaseLocalService(rackLocalService);
+		actionableDynamicQuery.setClassLoader(getClassLoader());
+		actionableDynamicQuery.setModelClass(Rack.class);
+
+		actionableDynamicQuery.setPrimaryKeyPropertyName("rackId");
+
+		return actionableDynamicQuery;
+	}
+
+	@Override
+	public IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() {
+		IndexableActionableDynamicQuery indexableActionableDynamicQuery = new IndexableActionableDynamicQuery();
+
+		indexableActionableDynamicQuery.setBaseLocalService(rackLocalService);
+		indexableActionableDynamicQuery.setClassLoader(getClassLoader());
+		indexableActionableDynamicQuery.setModelClass(Rack.class);
+
+		indexableActionableDynamicQuery.setPrimaryKeyPropertyName("rackId");
+
+		return indexableActionableDynamicQuery;
+	}
+
+	protected void initActionableDynamicQuery(
+		ActionableDynamicQuery actionableDynamicQuery) {
+		actionableDynamicQuery.setBaseLocalService(rackLocalService);
+		actionableDynamicQuery.setClassLoader(getClassLoader());
+		actionableDynamicQuery.setModelClass(Rack.class);
+
+		actionableDynamicQuery.setPrimaryKeyPropertyName("rackId");
+	}
+
+	@Override
+	public ExportActionableDynamicQuery getExportActionableDynamicQuery(
+		final PortletDataContext portletDataContext) {
+		final ExportActionableDynamicQuery exportActionableDynamicQuery = new ExportActionableDynamicQuery() {
+				@Override
+				public long performCount() throws PortalException {
+					ManifestSummary manifestSummary = portletDataContext.getManifestSummary();
+
+					StagedModelType stagedModelType = getStagedModelType();
+
+					long modelAdditionCount = super.performCount();
+
+					manifestSummary.addModelAdditionCount(stagedModelType,
+						modelAdditionCount);
+
+					long modelDeletionCount = ExportImportHelperUtil.getModelDeletionCount(portletDataContext,
+							stagedModelType);
+
+					manifestSummary.addModelDeletionCount(stagedModelType,
+						modelDeletionCount);
+
+					return modelAdditionCount;
+				}
+			};
+
+		initActionableDynamicQuery(exportActionableDynamicQuery);
+
+		exportActionableDynamicQuery.setAddCriteriaMethod(new ActionableDynamicQuery.AddCriteriaMethod() {
+				@Override
+				public void addCriteria(DynamicQuery dynamicQuery) {
+					portletDataContext.addDateRangeCriteria(dynamicQuery,
+						"modifiedDate");
+				}
+			});
+
+		exportActionableDynamicQuery.setCompanyId(portletDataContext.getCompanyId());
+
+		exportActionableDynamicQuery.setPerformActionMethod(new ActionableDynamicQuery.PerformActionMethod<Rack>() {
+				@Override
+				public void performAction(Rack rack) throws PortalException {
+					StagedModelDataHandlerUtil.exportStagedModel(portletDataContext,
+						rack);
+				}
+			});
+		exportActionableDynamicQuery.setStagedModelType(new StagedModelType(
+				PortalUtil.getClassNameId(Rack.class.getName())));
+
+		return exportActionableDynamicQuery;
+	}
+
+	/**
+	 * @throws PortalException
+	 */
+	@Override
+	public PersistedModel deletePersistedModel(PersistedModel persistedModel)
+		throws PortalException {
+		return rackLocalService.deleteRack((Rack)persistedModel);
+	}
+
+	@Override
+	public PersistedModel getPersistedModel(Serializable primaryKeyObj)
+		throws PortalException {
+		return rackPersistence.findByPrimaryKey(primaryKeyObj);
+	}
+
+	/**
+	 * Returns all the racks matching the UUID and company.
+	 *
+	 * @param uuid the UUID of the racks
+	 * @param companyId the primary key of the company
+	 * @return the matching racks, or an empty list if no matches were found
+	 */
+	@Override
+	public List<Rack> getRacksByUuidAndCompanyId(String uuid, long companyId) {
+		return rackPersistence.findByUuid_C(uuid, companyId);
+	}
+
+	/**
+	 * Returns a range of racks matching the UUID and company.
+	 *
+	 * @param uuid the UUID of the racks
+	 * @param companyId the primary key of the company
+	 * @param start the lower bound of the range of racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the range of matching racks, or an empty list if no matches were found
+	 */
+	@Override
+	public List<Rack> getRacksByUuidAndCompanyId(String uuid, long companyId,
+		int start, int end, OrderByComparator<Rack> orderByComparator) {
+		return rackPersistence.findByUuid_C(uuid, companyId, start, end,
+			orderByComparator);
+	}
+
+	/**
+	 * Returns the rack matching the UUID and group.
+	 *
+	 * @param uuid the rack's UUID
+	 * @param groupId the primary key of the group
+	 * @return the matching rack
+	 * @throws PortalException if a matching rack could not be found
+	 */
+	@Override
+	public Rack getRackByUuidAndGroupId(String uuid, long groupId)
+		throws PortalException {
+		return rackPersistence.findByUUID_G(uuid, groupId);
+	}
+
+	/**
+	 * Returns a range of all the racks.
+	 *
+	 * <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 fr.ippon.services.embercellar.model.impl.RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @return the range of racks
+	 */
+	@Override
+	public List<Rack> getRacks(int start, int end) {
+		return rackPersistence.findAll(start, end);
+	}
+
+	/**
+	 * Returns the number of racks.
+	 *
+	 * @return the number of racks
+	 */
+	@Override
+	public int getRacksCount() {
+		return rackPersistence.countAll();
+	}
+
+	/**
+	 * Updates the rack in the database or adds it if it does not yet exist. Also notifies the appropriate model listeners.
+	 *
+	 * @param rack the rack
+	 * @return the rack that was updated
+	 */
+	@Indexable(type = IndexableType.REINDEX)
+	@Override
+	public Rack updateRack(Rack rack) {
+		return rackPersistence.update(rack);
+	}
+
+	/**
+	 * Returns the bottle local service.
+	 *
+	 * @return the bottle local service
+	 */
+	public fr.ippon.services.embercellar.service.BottleLocalService getBottleLocalService() {
+		return bottleLocalService;
+	}
+
+	/**
+	 * Sets the bottle local service.
+	 *
+	 * @param bottleLocalService the bottle local service
+	 */
+	public void setBottleLocalService(
+		fr.ippon.services.embercellar.service.BottleLocalService bottleLocalService) {
+		this.bottleLocalService = bottleLocalService;
+	}
+
+	/**
+	 * Returns the bottle persistence.
+	 *
+	 * @return the bottle persistence
+	 */
+	public BottlePersistence getBottlePersistence() {
+		return bottlePersistence;
+	}
+
+	/**
+	 * Sets the bottle persistence.
+	 *
+	 * @param bottlePersistence the bottle persistence
+	 */
+	public void setBottlePersistence(BottlePersistence bottlePersistence) {
+		this.bottlePersistence = bottlePersistence;
+	}
+
+	/**
+	 * Returns the rack local service.
+	 *
+	 * @return the rack local service
+	 */
+	public RackLocalService getRackLocalService() {
+		return rackLocalService;
+	}
+
+	/**
+	 * Sets the rack local service.
+	 *
+	 * @param rackLocalService the rack local service
+	 */
+	public void setRackLocalService(RackLocalService rackLocalService) {
+		this.rackLocalService = rackLocalService;
+	}
+
+	/**
+	 * Returns the rack persistence.
+	 *
+	 * @return the rack persistence
+	 */
+	public RackPersistence getRackPersistence() {
+		return rackPersistence;
+	}
+
+	/**
+	 * Sets the rack persistence.
+	 *
+	 * @param rackPersistence the rack persistence
+	 */
+	public void setRackPersistence(RackPersistence rackPersistence) {
+		this.rackPersistence = rackPersistence;
+	}
+
+	/**
+	 * Returns the counter local service.
+	 *
+	 * @return the counter local service
+	 */
+	public com.liferay.counter.kernel.service.CounterLocalService getCounterLocalService() {
+		return counterLocalService;
+	}
+
+	/**
+	 * Sets the counter local service.
+	 *
+	 * @param counterLocalService the counter local service
+	 */
+	public void setCounterLocalService(
+		com.liferay.counter.kernel.service.CounterLocalService counterLocalService) {
+		this.counterLocalService = counterLocalService;
+	}
+
+	/**
+	 * Returns the class name local service.
+	 *
+	 * @return the class name local service
+	 */
+	public com.liferay.portal.kernel.service.ClassNameLocalService getClassNameLocalService() {
+		return classNameLocalService;
+	}
+
+	/**
+	 * Sets the class name local service.
+	 *
+	 * @param classNameLocalService the class name local service
+	 */
+	public void setClassNameLocalService(
+		com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService) {
+		this.classNameLocalService = classNameLocalService;
+	}
+
+	/**
+	 * Returns the class name persistence.
+	 *
+	 * @return the class name persistence
+	 */
+	public ClassNamePersistence getClassNamePersistence() {
+		return classNamePersistence;
+	}
+
+	/**
+	 * Sets the class name persistence.
+	 *
+	 * @param classNamePersistence the class name persistence
+	 */
+	public void setClassNamePersistence(
+		ClassNamePersistence classNamePersistence) {
+		this.classNamePersistence = classNamePersistence;
+	}
+
+	/**
+	 * Returns the resource local service.
+	 *
+	 * @return the resource local service
+	 */
+	public com.liferay.portal.kernel.service.ResourceLocalService getResourceLocalService() {
+		return resourceLocalService;
+	}
+
+	/**
+	 * Sets the resource local service.
+	 *
+	 * @param resourceLocalService the resource local service
+	 */
+	public void setResourceLocalService(
+		com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService) {
+		this.resourceLocalService = resourceLocalService;
+	}
+
+	/**
+	 * Returns the user local service.
+	 *
+	 * @return the user local service
+	 */
+	public com.liferay.portal.kernel.service.UserLocalService getUserLocalService() {
+		return userLocalService;
+	}
+
+	/**
+	 * Sets the user local service.
+	 *
+	 * @param userLocalService the user local service
+	 */
+	public void setUserLocalService(
+		com.liferay.portal.kernel.service.UserLocalService userLocalService) {
+		this.userLocalService = userLocalService;
+	}
+
+	/**
+	 * 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() {
+		persistedModelLocalServiceRegistry.register("fr.ippon.services.embercellar.model.Rack",
+			rackLocalService);
+	}
+
+	public void destroy() {
+		persistedModelLocalServiceRegistry.unregister(
+			"fr.ippon.services.embercellar.model.Rack");
+	}
+
+	/**
+	 * Returns the OSGi service identifier.
+	 *
+	 * @return the OSGi service identifier
+	 */
+	@Override
+	public String getOSGiServiceIdentifier() {
+		return RackLocalService.class.getName();
+	}
+
+	protected Class<?> getModelClass() {
+		return Rack.class;
+	}
+
+	protected String getModelClassName() {
+		return Rack.class.getName();
+	}
+
+	/**
+	 * Performs a SQL query.
+	 *
+	 * @param sql the sql query
+	 */
+	protected void runSQL(String sql) {
+		try {
+			DataSource dataSource = rackPersistence.getDataSource();
+
+			DB db = DBManagerUtil.getDB();
+
+			sql = db.buildSQL(sql);
+			sql = PortalUtil.transformSQL(sql);
+
+			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
+					sql);
+
+			sqlUpdate.update();
+		}
+		catch (Exception e) {
+			throw new SystemException(e);
+		}
+	}
+
+	@BeanReference(type = fr.ippon.services.embercellar.service.BottleLocalService.class)
+	protected fr.ippon.services.embercellar.service.BottleLocalService bottleLocalService;
+	@BeanReference(type = BottlePersistence.class)
+	protected BottlePersistence bottlePersistence;
+	@BeanReference(type = RackLocalService.class)
+	protected RackLocalService rackLocalService;
+	@BeanReference(type = RackPersistence.class)
+	protected RackPersistence rackPersistence;
+	@ServiceReference(type = com.liferay.counter.kernel.service.CounterLocalService.class)
+	protected com.liferay.counter.kernel.service.CounterLocalService counterLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ClassNameLocalService.class)
+	protected com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService;
+	@ServiceReference(type = ClassNamePersistence.class)
+	protected ClassNamePersistence classNamePersistence;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ResourceLocalService.class)
+	protected com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.UserLocalService.class)
+	protected com.liferay.portal.kernel.service.UserLocalService userLocalService;
+	@ServiceReference(type = UserPersistence.class)
+	protected UserPersistence userPersistence;
+	@ServiceReference(type = PersistedModelLocalServiceRegistry.class)
+	protected PersistedModelLocalServiceRegistry persistedModelLocalServiceRegistry;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/RackServiceBaseImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/RackServiceBaseImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a96c25aebe23a2458b383adc50397fcc18ff3792
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/base/RackServiceBaseImpl.java
@@ -0,0 +1,395 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.base;
+
+import com.liferay.portal.kernel.bean.BeanReference;
+import com.liferay.portal.kernel.dao.db.DB;
+import com.liferay.portal.kernel.dao.db.DBManagerUtil;
+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.kernel.module.framework.service.IdentifiableOSGiService;
+import com.liferay.portal.kernel.service.BaseServiceImpl;
+import com.liferay.portal.kernel.service.persistence.ClassNamePersistence;
+import com.liferay.portal.kernel.service.persistence.UserPersistence;
+import com.liferay.portal.kernel.util.PortalUtil;
+import com.liferay.portal.spring.extender.service.ServiceReference;
+
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.service.RackService;
+import fr.ippon.services.embercellar.service.persistence.BottlePersistence;
+import fr.ippon.services.embercellar.service.persistence.RackPersistence;
+
+import javax.sql.DataSource;
+
+/**
+ * Provides the base implementation for the rack 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 fr.ippon.services.embercellar.service.impl.RackServiceImpl}.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see fr.ippon.services.embercellar.service.impl.RackServiceImpl
+ * @see fr.ippon.services.embercellar.service.RackServiceUtil
+ * @generated
+ */
+public abstract class RackServiceBaseImpl extends BaseServiceImpl
+	implements RackService, IdentifiableOSGiService {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackServiceUtil} to access the rack remote service.
+	 */
+
+	/**
+	 * Returns the bottle local service.
+	 *
+	 * @return the bottle local service
+	 */
+	public fr.ippon.services.embercellar.service.BottleLocalService getBottleLocalService() {
+		return bottleLocalService;
+	}
+
+	/**
+	 * Sets the bottle local service.
+	 *
+	 * @param bottleLocalService the bottle local service
+	 */
+	public void setBottleLocalService(
+		fr.ippon.services.embercellar.service.BottleLocalService bottleLocalService) {
+		this.bottleLocalService = bottleLocalService;
+	}
+
+	/**
+	 * Returns the bottle remote service.
+	 *
+	 * @return the bottle remote service
+	 */
+	public fr.ippon.services.embercellar.service.BottleService getBottleService() {
+		return bottleService;
+	}
+
+	/**
+	 * Sets the bottle remote service.
+	 *
+	 * @param bottleService the bottle remote service
+	 */
+	public void setBottleService(
+		fr.ippon.services.embercellar.service.BottleService bottleService) {
+		this.bottleService = bottleService;
+	}
+
+	/**
+	 * Returns the bottle persistence.
+	 *
+	 * @return the bottle persistence
+	 */
+	public BottlePersistence getBottlePersistence() {
+		return bottlePersistence;
+	}
+
+	/**
+	 * Sets the bottle persistence.
+	 *
+	 * @param bottlePersistence the bottle persistence
+	 */
+	public void setBottlePersistence(BottlePersistence bottlePersistence) {
+		this.bottlePersistence = bottlePersistence;
+	}
+
+	/**
+	 * Returns the rack local service.
+	 *
+	 * @return the rack local service
+	 */
+	public fr.ippon.services.embercellar.service.RackLocalService getRackLocalService() {
+		return rackLocalService;
+	}
+
+	/**
+	 * Sets the rack local service.
+	 *
+	 * @param rackLocalService the rack local service
+	 */
+	public void setRackLocalService(
+		fr.ippon.services.embercellar.service.RackLocalService rackLocalService) {
+		this.rackLocalService = rackLocalService;
+	}
+
+	/**
+	 * Returns the rack remote service.
+	 *
+	 * @return the rack remote service
+	 */
+	public RackService getRackService() {
+		return rackService;
+	}
+
+	/**
+	 * Sets the rack remote service.
+	 *
+	 * @param rackService the rack remote service
+	 */
+	public void setRackService(RackService rackService) {
+		this.rackService = rackService;
+	}
+
+	/**
+	 * Returns the rack persistence.
+	 *
+	 * @return the rack persistence
+	 */
+	public RackPersistence getRackPersistence() {
+		return rackPersistence;
+	}
+
+	/**
+	 * Sets the rack persistence.
+	 *
+	 * @param rackPersistence the rack persistence
+	 */
+	public void setRackPersistence(RackPersistence rackPersistence) {
+		this.rackPersistence = rackPersistence;
+	}
+
+	/**
+	 * Returns the counter local service.
+	 *
+	 * @return the counter local service
+	 */
+	public com.liferay.counter.kernel.service.CounterLocalService getCounterLocalService() {
+		return counterLocalService;
+	}
+
+	/**
+	 * Sets the counter local service.
+	 *
+	 * @param counterLocalService the counter local service
+	 */
+	public void setCounterLocalService(
+		com.liferay.counter.kernel.service.CounterLocalService counterLocalService) {
+		this.counterLocalService = counterLocalService;
+	}
+
+	/**
+	 * Returns the class name local service.
+	 *
+	 * @return the class name local service
+	 */
+	public com.liferay.portal.kernel.service.ClassNameLocalService getClassNameLocalService() {
+		return classNameLocalService;
+	}
+
+	/**
+	 * Sets the class name local service.
+	 *
+	 * @param classNameLocalService the class name local service
+	 */
+	public void setClassNameLocalService(
+		com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService) {
+		this.classNameLocalService = classNameLocalService;
+	}
+
+	/**
+	 * Returns the class name remote service.
+	 *
+	 * @return the class name remote service
+	 */
+	public com.liferay.portal.kernel.service.ClassNameService getClassNameService() {
+		return classNameService;
+	}
+
+	/**
+	 * Sets the class name remote service.
+	 *
+	 * @param classNameService the class name remote service
+	 */
+	public void setClassNameService(
+		com.liferay.portal.kernel.service.ClassNameService classNameService) {
+		this.classNameService = classNameService;
+	}
+
+	/**
+	 * Returns the class name persistence.
+	 *
+	 * @return the class name persistence
+	 */
+	public ClassNamePersistence getClassNamePersistence() {
+		return classNamePersistence;
+	}
+
+	/**
+	 * Sets the class name persistence.
+	 *
+	 * @param classNamePersistence the class name persistence
+	 */
+	public void setClassNamePersistence(
+		ClassNamePersistence classNamePersistence) {
+		this.classNamePersistence = classNamePersistence;
+	}
+
+	/**
+	 * Returns the resource local service.
+	 *
+	 * @return the resource local service
+	 */
+	public com.liferay.portal.kernel.service.ResourceLocalService getResourceLocalService() {
+		return resourceLocalService;
+	}
+
+	/**
+	 * Sets the resource local service.
+	 *
+	 * @param resourceLocalService the resource local service
+	 */
+	public void setResourceLocalService(
+		com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService) {
+		this.resourceLocalService = resourceLocalService;
+	}
+
+	/**
+	 * Returns the user local service.
+	 *
+	 * @return the user local service
+	 */
+	public com.liferay.portal.kernel.service.UserLocalService getUserLocalService() {
+		return userLocalService;
+	}
+
+	/**
+	 * Sets the user local service.
+	 *
+	 * @param userLocalService the user local service
+	 */
+	public void setUserLocalService(
+		com.liferay.portal.kernel.service.UserLocalService userLocalService) {
+		this.userLocalService = userLocalService;
+	}
+
+	/**
+	 * Returns the user remote service.
+	 *
+	 * @return the user remote service
+	 */
+	public com.liferay.portal.kernel.service.UserService getUserService() {
+		return userService;
+	}
+
+	/**
+	 * Sets the user remote service.
+	 *
+	 * @param userService the user remote service
+	 */
+	public void setUserService(
+		com.liferay.portal.kernel.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() {
+	}
+
+	public void destroy() {
+	}
+
+	/**
+	 * Returns the OSGi service identifier.
+	 *
+	 * @return the OSGi service identifier
+	 */
+	@Override
+	public String getOSGiServiceIdentifier() {
+		return RackService.class.getName();
+	}
+
+	protected Class<?> getModelClass() {
+		return Rack.class;
+	}
+
+	protected String getModelClassName() {
+		return Rack.class.getName();
+	}
+
+	/**
+	 * Performs a SQL query.
+	 *
+	 * @param sql the sql query
+	 */
+	protected void runSQL(String sql) {
+		try {
+			DataSource dataSource = rackPersistence.getDataSource();
+
+			DB db = DBManagerUtil.getDB();
+
+			sql = db.buildSQL(sql);
+			sql = PortalUtil.transformSQL(sql);
+
+			SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource,
+					sql);
+
+			sqlUpdate.update();
+		}
+		catch (Exception e) {
+			throw new SystemException(e);
+		}
+	}
+
+	@BeanReference(type = fr.ippon.services.embercellar.service.BottleLocalService.class)
+	protected fr.ippon.services.embercellar.service.BottleLocalService bottleLocalService;
+	@BeanReference(type = fr.ippon.services.embercellar.service.BottleService.class)
+	protected fr.ippon.services.embercellar.service.BottleService bottleService;
+	@BeanReference(type = BottlePersistence.class)
+	protected BottlePersistence bottlePersistence;
+	@BeanReference(type = fr.ippon.services.embercellar.service.RackLocalService.class)
+	protected fr.ippon.services.embercellar.service.RackLocalService rackLocalService;
+	@BeanReference(type = RackService.class)
+	protected RackService rackService;
+	@BeanReference(type = RackPersistence.class)
+	protected RackPersistence rackPersistence;
+	@ServiceReference(type = com.liferay.counter.kernel.service.CounterLocalService.class)
+	protected com.liferay.counter.kernel.service.CounterLocalService counterLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ClassNameLocalService.class)
+	protected com.liferay.portal.kernel.service.ClassNameLocalService classNameLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ClassNameService.class)
+	protected com.liferay.portal.kernel.service.ClassNameService classNameService;
+	@ServiceReference(type = ClassNamePersistence.class)
+	protected ClassNamePersistence classNamePersistence;
+	@ServiceReference(type = com.liferay.portal.kernel.service.ResourceLocalService.class)
+	protected com.liferay.portal.kernel.service.ResourceLocalService resourceLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.UserLocalService.class)
+	protected com.liferay.portal.kernel.service.UserLocalService userLocalService;
+	@ServiceReference(type = com.liferay.portal.kernel.service.UserService.class)
+	protected com.liferay.portal.kernel.service.UserService userService;
+	@ServiceReference(type = UserPersistence.class)
+	protected UserPersistence userPersistence;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/BottleServiceHttp.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/BottleServiceHttp.java
new file mode 100644
index 0000000000000000000000000000000000000000..0835a5c9c7adae5442fb1e23020d59159fd9175d
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/BottleServiceHttp.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.http;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.security.auth.HttpPrincipal;
+import com.liferay.portal.kernel.service.http.TunnelUtil;
+import com.liferay.portal.kernel.util.MethodHandler;
+import com.liferay.portal.kernel.util.MethodKey;
+
+import fr.ippon.services.embercellar.service.BottleServiceUtil;
+
+/**
+ * Provides the HTTP utility for the
+ * {@link BottleServiceUtil} service utility. The
+ * static methods of this class calls the same methods of the service utility.
+ * However, the signatures are different because it requires an additional
+ * {@link HttpPrincipal} parameter.
+ *
+ * <p>
+ * The benefits of using the HTTP utility is that it is fast and allows for
+ * tunneling without the cost of serializing to text. The drawback is that it
+ * only works with Java.
+ * </p>
+ *
+ * <p>
+ * Set the property <b>tunnel.servlet.hosts.allowed</b> in portal.properties to
+ * configure security.
+ * </p>
+ *
+ * <p>
+ * The HTTP utility is only generated for remote services.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleServiceSoap
+ * @see HttpPrincipal
+ * @see BottleServiceUtil
+ * @generated
+ */
+@ProviderType
+public class BottleServiceHttp {
+	public static fr.ippon.services.embercellar.model.Bottle addBottle(
+		HttpPrincipal httpPrincipal, java.lang.String name, int column,
+		int row, boolean flipped, long rackId,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws com.liferay.portal.kernel.exception.NoSuchUserException {
+		try {
+			MethodKey methodKey = new MethodKey(BottleServiceUtil.class,
+					"addBottle", _addBottleParameterTypes0);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey, name,
+					column, row, flipped, rackId, serviceContext);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				if (e instanceof com.liferay.portal.kernel.exception.NoSuchUserException) {
+					throw (com.liferay.portal.kernel.exception.NoSuchUserException)e;
+				}
+
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (fr.ippon.services.embercellar.model.Bottle)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	public static fr.ippon.services.embercellar.model.Bottle findByBottleId(
+		HttpPrincipal httpPrincipal, long bottleId) {
+		try {
+			MethodKey methodKey = new MethodKey(BottleServiceUtil.class,
+					"findByBottleId", _findByBottleIdParameterTypes1);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey, bottleId);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (fr.ippon.services.embercellar.model.Bottle)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> findByRackId(
+		HttpPrincipal httpPrincipal, long rackId) {
+		try {
+			MethodKey methodKey = new MethodKey(BottleServiceUtil.class,
+					"findByRackId", _findByRackIdParameterTypes2);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey, rackId);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (java.util.List<fr.ippon.services.embercellar.model.Bottle>)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	public static java.util.List<fr.ippon.services.embercellar.model.Bottle> findAll(
+		HttpPrincipal httpPrincipal) {
+		try {
+			MethodKey methodKey = new MethodKey(BottleServiceUtil.class,
+					"findAll", _findAllParameterTypes3);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (java.util.List<fr.ippon.services.embercellar.model.Bottle>)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	private static Log _log = LogFactoryUtil.getLog(BottleServiceHttp.class);
+	private static final Class<?>[] _addBottleParameterTypes0 = new Class[] {
+			java.lang.String.class, int.class, int.class, boolean.class,
+			long.class, com.liferay.portal.kernel.service.ServiceContext.class
+		};
+	private static final Class<?>[] _findByBottleIdParameterTypes1 = new Class[] {
+			long.class
+		};
+	private static final Class<?>[] _findByRackIdParameterTypes2 = new Class[] {
+			long.class
+		};
+	private static final Class<?>[] _findAllParameterTypes3 = new Class[] {  };
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/BottleServiceSoap.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/BottleServiceSoap.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6057520d1530889a5f9c5c45dc9d12d9d20dcf9
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/BottleServiceSoap.java
@@ -0,0 +1,136 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.http;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+
+import fr.ippon.services.embercellar.service.BottleServiceUtil;
+
+import java.rmi.RemoteException;
+
+/**
+ * Provides the SOAP utility for the
+ * {@link BottleServiceUtil} 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 fr.ippon.services.embercellar.model.BottleSoap}.
+ * If the method in the service utility returns a
+ * {@link fr.ippon.services.embercellar.model.Bottle}, that is translated to a
+ * {@link fr.ippon.services.embercellar.model.BottleSoap}. 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 Brian Wing Shun Chan
+ * @see BottleServiceHttp
+ * @see fr.ippon.services.embercellar.model.BottleSoap
+ * @see BottleServiceUtil
+ * @generated
+ */
+@ProviderType
+public class BottleServiceSoap {
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link BottleServiceUtil} to access the bottle remote service.
+	*/
+	public static fr.ippon.services.embercellar.model.BottleSoap addBottle(
+		java.lang.String name, int column, int row, boolean flipped,
+		long rackId,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws RemoteException {
+		try {
+			fr.ippon.services.embercellar.model.Bottle returnValue = BottleServiceUtil.addBottle(name,
+					column, row, flipped, rackId, serviceContext);
+
+			return fr.ippon.services.embercellar.model.BottleSoap.toSoapModel(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	public static fr.ippon.services.embercellar.model.BottleSoap findByBottleId(
+		long bottleId) throws RemoteException {
+		try {
+			fr.ippon.services.embercellar.model.Bottle returnValue = BottleServiceUtil.findByBottleId(bottleId);
+
+			return fr.ippon.services.embercellar.model.BottleSoap.toSoapModel(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	public static fr.ippon.services.embercellar.model.BottleSoap[] findByRackId(
+		long rackId) throws RemoteException {
+		try {
+			java.util.List<fr.ippon.services.embercellar.model.Bottle> returnValue =
+				BottleServiceUtil.findByRackId(rackId);
+
+			return fr.ippon.services.embercellar.model.BottleSoap.toSoapModels(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	public static fr.ippon.services.embercellar.model.BottleSoap[] findAll()
+		throws RemoteException {
+		try {
+			java.util.List<fr.ippon.services.embercellar.model.Bottle> returnValue =
+				BottleServiceUtil.findAll();
+
+			return fr.ippon.services.embercellar.model.BottleSoap.toSoapModels(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	private static Log _log = LogFactoryUtil.getLog(BottleServiceSoap.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/RackServiceHttp.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/RackServiceHttp.java
new file mode 100644
index 0000000000000000000000000000000000000000..83c857c494d8d3862601803f0fd872cad72845e5
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/RackServiceHttp.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.http;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.security.auth.HttpPrincipal;
+import com.liferay.portal.kernel.service.http.TunnelUtil;
+import com.liferay.portal.kernel.util.MethodHandler;
+import com.liferay.portal.kernel.util.MethodKey;
+
+import fr.ippon.services.embercellar.service.RackServiceUtil;
+
+/**
+ * Provides the HTTP utility for the
+ * {@link RackServiceUtil} service utility. The
+ * static methods of this class calls the same methods of the service utility.
+ * However, the signatures are different because it requires an additional
+ * {@link HttpPrincipal} parameter.
+ *
+ * <p>
+ * The benefits of using the HTTP utility is that it is fast and allows for
+ * tunneling without the cost of serializing to text. The drawback is that it
+ * only works with Java.
+ * </p>
+ *
+ * <p>
+ * Set the property <b>tunnel.servlet.hosts.allowed</b> in portal.properties to
+ * configure security.
+ * </p>
+ *
+ * <p>
+ * The HTTP utility is only generated for remote services.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackServiceSoap
+ * @see HttpPrincipal
+ * @see RackServiceUtil
+ * @generated
+ */
+@ProviderType
+public class RackServiceHttp {
+	public static fr.ippon.services.embercellar.model.Rack addRack(
+		HttpPrincipal httpPrincipal, java.lang.String name, int nbColumns,
+		int nbRows, java.lang.String pathImg,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext) {
+		try {
+			MethodKey methodKey = new MethodKey(RackServiceUtil.class,
+					"addRack", _addRackParameterTypes0);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey, name,
+					nbColumns, nbRows, pathImg, serviceContext);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (fr.ippon.services.embercellar.model.Rack)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	public static java.util.List<fr.ippon.services.embercellar.model.Rack> findAll(
+		HttpPrincipal httpPrincipal) {
+		try {
+			MethodKey methodKey = new MethodKey(RackServiceUtil.class,
+					"findAll", _findAllParameterTypes1);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (java.util.List<fr.ippon.services.embercellar.model.Rack>)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	public static fr.ippon.services.embercellar.model.Rack findByRackId(
+		HttpPrincipal httpPrincipal, long rackId) {
+		try {
+			MethodKey methodKey = new MethodKey(RackServiceUtil.class,
+					"findByRackId", _findByRackIdParameterTypes2);
+
+			MethodHandler methodHandler = new MethodHandler(methodKey, rackId);
+
+			Object returnObj = null;
+
+			try {
+				returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler);
+			}
+			catch (Exception e) {
+				throw new com.liferay.portal.kernel.exception.SystemException(e);
+			}
+
+			return (fr.ippon.services.embercellar.model.Rack)returnObj;
+		}
+		catch (com.liferay.portal.kernel.exception.SystemException se) {
+			_log.error(se, se);
+
+			throw se;
+		}
+	}
+
+	private static Log _log = LogFactoryUtil.getLog(RackServiceHttp.class);
+	private static final Class<?>[] _addRackParameterTypes0 = new Class[] {
+			java.lang.String.class, int.class, int.class, java.lang.String.class,
+			com.liferay.portal.kernel.service.ServiceContext.class
+		};
+	private static final Class<?>[] _findAllParameterTypes1 = new Class[] {  };
+	private static final Class<?>[] _findByRackIdParameterTypes2 = new Class[] {
+			long.class
+		};
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/RackServiceSoap.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/RackServiceSoap.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2bc7490ed655286b91dfee66d20308da212984e
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/http/RackServiceSoap.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.http;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+
+import fr.ippon.services.embercellar.service.RackServiceUtil;
+
+import java.rmi.RemoteException;
+
+/**
+ * Provides the SOAP utility for the
+ * {@link RackServiceUtil} 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 fr.ippon.services.embercellar.model.RackSoap}.
+ * If the method in the service utility returns a
+ * {@link fr.ippon.services.embercellar.model.Rack}, that is translated to a
+ * {@link fr.ippon.services.embercellar.model.RackSoap}. 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 Brian Wing Shun Chan
+ * @see RackServiceHttp
+ * @see fr.ippon.services.embercellar.model.RackSoap
+ * @see RackServiceUtil
+ * @generated
+ */
+@ProviderType
+public class RackServiceSoap {
+	public static fr.ippon.services.embercellar.model.RackSoap addRack(
+		java.lang.String name, int nbColumns, int nbRows,
+		java.lang.String pathImg,
+		com.liferay.portal.kernel.service.ServiceContext serviceContext)
+		throws RemoteException {
+		try {
+			fr.ippon.services.embercellar.model.Rack returnValue = RackServiceUtil.addRack(name,
+					nbColumns, nbRows, pathImg, serviceContext);
+
+			return fr.ippon.services.embercellar.model.RackSoap.toSoapModel(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	/**
+	* NOTE FOR DEVELOPERS:
+	*
+	* Never reference this class directly. Always use {@link RackServiceUtil} to access the rack remote service.
+	*/
+	public static fr.ippon.services.embercellar.model.RackSoap[] findAll()
+		throws RemoteException {
+		try {
+			java.util.List<fr.ippon.services.embercellar.model.Rack> returnValue =
+				RackServiceUtil.findAll();
+
+			return fr.ippon.services.embercellar.model.RackSoap.toSoapModels(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	public static fr.ippon.services.embercellar.model.RackSoap findByRackId(
+		long rackId) throws RemoteException {
+		try {
+			fr.ippon.services.embercellar.model.Rack returnValue = RackServiceUtil.findByRackId(rackId);
+
+			return fr.ippon.services.embercellar.model.RackSoap.toSoapModel(returnValue);
+		}
+		catch (Exception e) {
+			_log.error(e, e);
+
+			throw new RemoteException(e.getMessage());
+		}
+	}
+
+	private static Log _log = LogFactoryUtil.getLog(RackServiceSoap.class);
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/BottleLocalServiceImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/BottleLocalServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..40493e1599bfb66176eba451727b7da113a43c48
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/BottleLocalServiceImpl.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.NoSuchUserException;
+import com.liferay.portal.kernel.model.User;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.service.base.BottleLocalServiceBaseImpl;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * The implementation of the bottle local service.
+ *
+ * <p>
+ * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link fr.ippon.services.embercellar.service.BottleLocalService} interface.
+ *
+ * <p>
+ * This is a local service. 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.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleLocalServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.BottleLocalServiceUtil
+ */
+@ProviderType
+public class BottleLocalServiceImpl extends BottleLocalServiceBaseImpl {
+
+	public Bottle addBottle(long userId, long groupId,
+							String name, int column, int row, boolean flipped,
+							long rackId,
+							ServiceContext serviceContext) throws NoSuchUserException {
+
+		User user = userPersistence.findByPrimaryKey(userId);
+		Date now = new Date();
+
+		long bottleId = counterLocalService.increment(Bottle.class.getName());
+		Bottle bottle = bottlePersistence.create(bottleId);
+
+		bottle.setUserId(userId);
+		bottle.setGroupId(groupId);
+		bottle.setCompanyId(user.getCompanyId());
+		bottle.setCreateDate(serviceContext.getCreateDate(now));
+		bottle.setModifiedDate(serviceContext.getModifiedDate(now));
+		bottle.setName(name);
+		bottle.setXcolumn(column);
+		bottle.setYrow(row);
+		bottle.setFlipped(flipped);
+		bottle.setRackId(rackId);
+
+		super.addBottle(bottle);
+
+		return bottle;
+	}
+
+	/**
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleLocalServiceUtil} to access the bottle local service.
+	 */
+
+	public List<Bottle> findByRackId(long rackId) {
+		return bottlePersistence.findByRackId(rackId);
+	}
+
+	public List<Bottle> findAll() {
+		return bottlePersistence.findAll();
+	}
+}
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/BottleServiceImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/BottleServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..340ccb6cbe0fe5006121ddc2085034d3116a764d
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/BottleServiceImpl.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.NoSuchUserException;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.model.User;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.service.base.BottleServiceBaseImpl;
+
+import java.util.List;
+
+/**
+ * The implementation of the bottle remote service.
+ *
+ * <p>
+ * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link fr.ippon.services.embercellar.service.BottleService} interface.
+ *
+ * <p>
+ * This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottleServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.BottleServiceUtil
+ */
+@ProviderType
+public class BottleServiceImpl extends BottleServiceBaseImpl {
+	private static Log _log = LogFactoryUtil.getLog(BottleServiceImpl.class);
+
+	/**
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.BottleServiceUtil} to access the bottle remote service.
+	 */
+	public Bottle addBottle(
+			String name, int column, int row, boolean flipped, long rackId,
+			ServiceContext serviceContext)
+		throws NoSuchUserException {
+
+		User user = null;
+
+		try {
+			user = userLocalService.getUser(this.getUserId());
+			long groupId = user.getGroupId();
+			return bottleLocalService.addBottle(
+				this.getUserId(), groupId, name, column, row, flipped, rackId,
+				serviceContext);
+
+		} catch (PortalException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	public Bottle findByBottleId(long bottleId) {
+		try {
+			return bottleLocalService.getBottle(bottleId);
+		} catch (PortalException e) {
+			return null;
+		}
+	}
+
+	public List<Bottle> findByRackId(long rackId) {
+		return bottleLocalService.findByRackId(rackId);
+	}
+
+
+	public List<Bottle> findAll() {
+		return bottleLocalService.findAll();
+	}
+}
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/RackLocalServiceImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/RackLocalServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..5dd54d78a06bd667c9b95abb34a2569332fc7871
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/RackLocalServiceImpl.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.NoSuchUserException;
+import com.liferay.portal.kernel.model.User;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import fr.ippon.services.embercellar.exception.NoSuchRackException;
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.service.base.RackLocalServiceBaseImpl;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * The implementation of the rack local service.
+ *
+ * <p>
+ * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link fr.ippon.services.embercellar.service.RackLocalService} interface.
+ *
+ * <p>
+ * This is a local service. 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.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackLocalServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.RackLocalServiceUtil
+ */
+@ProviderType
+public class RackLocalServiceImpl extends RackLocalServiceBaseImpl {
+
+	public Rack addRack(long userId, long groupId,
+						String name, int nbColumns, int nbRows, String pathImg,
+						ServiceContext serviceContext) throws NoSuchUserException {
+
+		User user = userPersistence.findByPrimaryKey(userId);
+		Date now = new Date();
+
+		long rackId = counterLocalService.increment(Rack.class.getName());
+		Rack rack = rackPersistence.create(rackId);
+
+		rack.setUserId(userId);
+		rack.setCompanyId(user.getCompanyId());
+		rack.setGroupId(groupId);
+		rack.setCreateDate(serviceContext.getCreateDate(now));
+		rack.setModifiedDate(serviceContext.getModifiedDate(now));
+		rack.setName(name);
+		rack.setNbColumns(nbColumns);
+		rack.setNbRows(nbRows);
+		rack.setImage(pathImg);
+
+		super.addRack(rack);
+
+		return rack;
+	}
+
+	/**
+	 * NOTE FOR DEVELOPERS:
+	 * <p/>
+	 * Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackLocalServiceUtil} to access the rack local service.
+	 */
+	public List<Rack> findAll() {
+		return rackPersistence.findAll();
+	}
+
+	public Rack findByRackId(long rackId) {
+		try {
+			Rack rack = rackPersistence.findByPrimaryKey(rackId);
+			return rack;
+		} catch (NoSuchRackException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+}
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/RackServiceImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/RackServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd25f17066093ac32ab3a781d51a609183fa8530
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/impl/RackServiceImpl.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.model.User;
+import com.liferay.portal.kernel.service.ServiceContext;
+
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.service.base.RackServiceBaseImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The implementation of the rack remote service.
+ *
+ * <p>
+ * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link fr.ippon.services.embercellar.service.RackService} interface.
+ *
+ * <p>
+ * This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackServiceBaseImpl
+ * @see fr.ippon.services.embercellar.service.RackServiceUtil
+ */
+@ProviderType
+public class RackServiceImpl extends RackServiceBaseImpl {
+
+	public Rack addRack(
+		String name, int nbColumns, int nbRows, String pathImg,
+		ServiceContext serviceContext) {
+
+		try {
+			User user = userLocalService.getUser(this.getUserId());
+
+			long groupId = user.getGroupId();
+			return rackLocalService.addRack(
+				this.getUserId(), groupId, name, nbColumns, nbRows, pathImg,
+				serviceContext);
+		} catch (PortalException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never reference this class directly. Always use {@link fr.ippon.services.embercellar.service.RackServiceUtil} to access the rack remote service.
+	 */
+	public List<Rack> findAll() {
+		return rackLocalService.findAll();
+	}
+
+	public Rack findByRackId(long rackId) {
+		Rack rack = rackLocalService.findByRackId(rackId);
+
+		List<Bottle> bottles = bottleLocalService.findByRackId(rackId);
+		List<Long> bottleIds = new ArrayList<>();
+
+		for (Bottle bottle : bottles)
+			bottleIds.add(bottle.getBottleId());
+
+		rack.setBottlesId(bottleIds.toString());
+
+		return rack;
+	}
+
+}
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/persistence/impl/BottlePersistenceImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/persistence/impl/BottlePersistenceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..52f9689b3d8c3cf41db757c0c356e1edca8d3598
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/persistence/impl/BottlePersistenceImpl.java
@@ -0,0 +1,3327 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.persistence.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.dao.orm.EntityCache;
+import com.liferay.portal.kernel.dao.orm.FinderCache;
+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.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.service.ServiceContextThreadLocal;
+import com.liferay.portal.kernel.service.persistence.CompanyProvider;
+import com.liferay.portal.kernel.service.persistence.CompanyProviderWrapper;
+import com.liferay.portal.kernel.service.persistence.impl.BasePersistenceImpl;
+import com.liferay.portal.kernel.util.OrderByComparator;
+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.Validator;
+import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
+import com.liferay.portal.spring.extender.service.ServiceReference;
+
+import fr.ippon.services.embercellar.exception.NoSuchBottleException;
+import fr.ippon.services.embercellar.model.Bottle;
+import fr.ippon.services.embercellar.model.impl.BottleImpl;
+import fr.ippon.services.embercellar.model.impl.BottleModelImpl;
+import fr.ippon.services.embercellar.service.persistence.BottlePersistence;
+
+import java.io.Serializable;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * The persistence implementation for the bottle service.
+ *
+ * <p>
+ * Caching information and settings can be found in <code>portal.properties</code>
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see BottlePersistence
+ * @see fr.ippon.services.embercellar.service.persistence.BottleUtil
+ * @generated
+ */
+@ProviderType
+public class BottlePersistenceImpl extends BasePersistenceImpl<Bottle>
+	implements BottlePersistence {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. Always use {@link BottleUtil} to access the bottle persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
+	 */
+	public static final String FINDER_CLASS_NAME_ENTITY = BottleImpl.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(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findAll", new String[0]);
+	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findAll", new String[0]);
+	public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.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(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.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(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid",
+			new String[] { String.class.getName() },
+			BottleModelImpl.UUID_COLUMN_BITMASK |
+			BottleModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_UUID = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid",
+			new String[] { String.class.getName() });
+
+	/**
+	 * Returns all the bottles where uuid = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @return the matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid(String uuid) {
+		return findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @return the range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid(String uuid, int start, int end) {
+		return findByUuid(uuid, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid(String uuid, int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return findByUuid(uuid, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid(String uuid, int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		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<Bottle> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Bottle>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Bottle bottle : list) {
+					if (!Objects.equals(uuid, bottle.getUuid())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(3 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(3);
+			}
+
+			query.append(_SQL_SELECT_BOTTLE_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(BottleModelImpl.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<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first bottle 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 bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByUuid_First(String uuid,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByUuid_First(uuid, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		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 NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the first bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByUuid_First(String uuid,
+		OrderByComparator<Bottle> orderByComparator) {
+		List<Bottle> list = findByUuid(uuid, 0, 1, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last bottle 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 bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByUuid_Last(String uuid,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByUuid_Last(uuid, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		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 NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the last bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByUuid_Last(String uuid,
+		OrderByComparator<Bottle> orderByComparator) {
+		int count = countByUuid(uuid);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Bottle> list = findByUuid(uuid, count - 1, count, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the bottles before and after the current bottle in the ordered set where uuid = &#63;.
+	 *
+	 * @param bottleId the primary key of the current bottle
+	 * @param uuid the uuid
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the previous, current, and next bottle
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle[] findByUuid_PrevAndNext(long bottleId, String uuid,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = findByPrimaryKey(bottleId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Bottle[] array = new BottleImpl[3];
+
+			array[0] = getByUuid_PrevAndNext(session, bottle, uuid,
+					orderByComparator, true);
+
+			array[1] = bottle;
+
+			array[2] = getByUuid_PrevAndNext(session, bottle, uuid,
+					orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Bottle getByUuid_PrevAndNext(Session session, Bottle bottle,
+		String uuid, OrderByComparator<Bottle> orderByComparator,
+		boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(4 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(3);
+		}
+
+		query.append(_SQL_SELECT_BOTTLE_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(BottleModelImpl.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(bottle);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Bottle> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the bottles where uuid = &#63; from the database.
+	 *
+	 * @param uuid the uuid
+	 */
+	@Override
+	public void removeByUuid(String uuid) {
+		for (Bottle bottle : findByUuid(uuid, QueryUtil.ALL_POS,
+				QueryUtil.ALL_POS, null)) {
+			remove(bottle);
+		}
+	}
+
+	/**
+	 * Returns the number of bottles where uuid = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @return the number of matching bottles
+	 */
+	@Override
+	public int countByUuid(String uuid) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID;
+
+		Object[] finderArgs = new Object[] { uuid };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(2);
+
+			query.append(_SQL_COUNT_BOTTLE_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();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_UUID_UUID_1 = "bottle.uuid IS NULL";
+	private static final String _FINDER_COLUMN_UUID_UUID_2 = "bottle.uuid = ?";
+	private static final String _FINDER_COLUMN_UUID_UUID_3 = "(bottle.uuid IS NULL OR bottle.uuid = '')";
+	public static final FinderPath FINDER_PATH_FETCH_BY_UUID_G = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_ENTITY, "fetchByUUID_G",
+			new String[] { String.class.getName(), Long.class.getName() },
+			BottleModelImpl.UUID_COLUMN_BITMASK |
+			BottleModelImpl.GROUPID_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_UUID_G = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUUID_G",
+			new String[] { String.class.getName(), Long.class.getName() });
+
+	/**
+	 * Returns the bottle where uuid = &#63; and groupId = &#63; or throws a {@link NoSuchBottleException} if it could not be found.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the matching bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByUUID_G(String uuid, long groupId)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByUUID_G(uuid, groupId);
+
+		if (bottle == null) {
+			StringBundler msg = new StringBundler(6);
+
+			msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+			msg.append("uuid=");
+			msg.append(uuid);
+
+			msg.append(", groupId=");
+			msg.append(groupId);
+
+			msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+			if (_log.isDebugEnabled()) {
+				_log.debug(msg.toString());
+			}
+
+			throw new NoSuchBottleException(msg.toString());
+		}
+
+		return bottle;
+	}
+
+	/**
+	 * Returns the bottle where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByUUID_G(String uuid, long groupId) {
+		return fetchByUUID_G(uuid, groupId, true);
+	}
+
+	/**
+	 * Returns the bottle where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByUUID_G(String uuid, long groupId,
+		boolean retrieveFromCache) {
+		Object[] finderArgs = new Object[] { uuid, groupId };
+
+		Object result = null;
+
+		if (retrieveFromCache) {
+			result = finderCache.getResult(FINDER_PATH_FETCH_BY_UUID_G,
+					finderArgs, this);
+		}
+
+		if (result instanceof Bottle) {
+			Bottle bottle = (Bottle)result;
+
+			if (!Objects.equals(uuid, bottle.getUuid()) ||
+					(groupId != bottle.getGroupId())) {
+				result = null;
+			}
+		}
+
+		if (result == null) {
+			StringBundler query = new StringBundler(4);
+
+			query.append(_SQL_SELECT_BOTTLE_WHERE);
+
+			boolean bindUuid = false;
+
+			if (uuid == null) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_1);
+			}
+			else if (uuid.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_3);
+			}
+			else {
+				bindUuid = true;
+
+				query.append(_FINDER_COLUMN_UUID_G_UUID_2);
+			}
+
+			query.append(_FINDER_COLUMN_UUID_G_GROUPID_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(groupId);
+
+				List<Bottle> list = q.list();
+
+				if (list.isEmpty()) {
+					finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G,
+						finderArgs, list);
+				}
+				else {
+					Bottle bottle = list.get(0);
+
+					result = bottle;
+
+					cacheResult(bottle);
+
+					if ((bottle.getUuid() == null) ||
+							!bottle.getUuid().equals(uuid) ||
+							(bottle.getGroupId() != groupId)) {
+						finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G,
+							finderArgs, bottle);
+					}
+				}
+			}
+			catch (Exception e) {
+				finderCache.removeResult(FINDER_PATH_FETCH_BY_UUID_G, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		if (result instanceof List<?>) {
+			return null;
+		}
+		else {
+			return (Bottle)result;
+		}
+	}
+
+	/**
+	 * Removes the bottle where uuid = &#63; and groupId = &#63; from the database.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the bottle that was removed
+	 */
+	@Override
+	public Bottle removeByUUID_G(String uuid, long groupId)
+		throws NoSuchBottleException {
+		Bottle bottle = findByUUID_G(uuid, groupId);
+
+		return remove(bottle);
+	}
+
+	/**
+	 * Returns the number of bottles where uuid = &#63; and groupId = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the number of matching bottles
+	 */
+	@Override
+	public int countByUUID_G(String uuid, long groupId) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID_G;
+
+		Object[] finderArgs = new Object[] { uuid, groupId };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(3);
+
+			query.append(_SQL_COUNT_BOTTLE_WHERE);
+
+			boolean bindUuid = false;
+
+			if (uuid == null) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_1);
+			}
+			else if (uuid.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_3);
+			}
+			else {
+				bindUuid = true;
+
+				query.append(_FINDER_COLUMN_UUID_G_UUID_2);
+			}
+
+			query.append(_FINDER_COLUMN_UUID_G_GROUPID_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(groupId);
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_UUID_G_UUID_1 = "bottle.uuid IS NULL AND ";
+	private static final String _FINDER_COLUMN_UUID_G_UUID_2 = "bottle.uuid = ? AND ";
+	private static final String _FINDER_COLUMN_UUID_G_UUID_3 = "(bottle.uuid IS NULL OR bottle.uuid = '') AND ";
+	private static final String _FINDER_COLUMN_UUID_G_GROUPID_2 = "bottle.groupId = ?";
+	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID_C = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.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(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid_C",
+			new String[] { String.class.getName(), Long.class.getName() },
+			BottleModelImpl.UUID_COLUMN_BITMASK |
+			BottleModelImpl.COMPANYID_COLUMN_BITMASK |
+			BottleModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_UUID_C = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid_C",
+			new String[] { String.class.getName(), Long.class.getName() });
+
+	/**
+	 * Returns all the bottles where uuid = &#63; and companyId = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @param companyId the company ID
+	 * @return the matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid_C(String uuid, long companyId) {
+		return findByUuid_C(uuid, companyId, QueryUtil.ALL_POS,
+			QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @return the range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid_C(String uuid, long companyId, int start,
+		int end) {
+		return findByUuid_C(uuid, companyId, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid_C(String uuid, long companyId, int start,
+		int end, OrderByComparator<Bottle> orderByComparator) {
+		return findByUuid_C(uuid, companyId, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByUuid_C(String uuid, long companyId, int start,
+		int end, OrderByComparator<Bottle> orderByComparator,
+		boolean retrieveFromCache) {
+		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<Bottle> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Bottle>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Bottle bottle : list) {
+					if (!Objects.equals(uuid, bottle.getUuid()) ||
+							(companyId != bottle.getCompanyId())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(4 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(4);
+			}
+
+			query.append(_SQL_SELECT_BOTTLE_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(BottleModelImpl.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<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first bottle 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 bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByUuid_C_First(String uuid, long companyId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByUuid_C_First(uuid, companyId, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		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 NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the first bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByUuid_C_First(String uuid, long companyId,
+		OrderByComparator<Bottle> orderByComparator) {
+		List<Bottle> list = findByUuid_C(uuid, companyId, 0, 1,
+				orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last bottle 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 bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByUuid_C_Last(String uuid, long companyId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByUuid_C_Last(uuid, companyId, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		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 NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the last bottle 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 bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByUuid_C_Last(String uuid, long companyId,
+		OrderByComparator<Bottle> orderByComparator) {
+		int count = countByUuid_C(uuid, companyId);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Bottle> list = findByUuid_C(uuid, companyId, count - 1, count,
+				orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the bottles before and after the current bottle in the ordered set where uuid = &#63; and companyId = &#63;.
+	 *
+	 * @param bottleId the primary key of the current bottle
+	 * @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 bottle
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle[] findByUuid_C_PrevAndNext(long bottleId, String uuid,
+		long companyId, OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = findByPrimaryKey(bottleId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Bottle[] array = new BottleImpl[3];
+
+			array[0] = getByUuid_C_PrevAndNext(session, bottle, uuid,
+					companyId, orderByComparator, true);
+
+			array[1] = bottle;
+
+			array[2] = getByUuid_C_PrevAndNext(session, bottle, uuid,
+					companyId, orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Bottle getByUuid_C_PrevAndNext(Session session, Bottle bottle,
+		String uuid, long companyId,
+		OrderByComparator<Bottle> orderByComparator, boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(5 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(4);
+		}
+
+		query.append(_SQL_SELECT_BOTTLE_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(BottleModelImpl.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(bottle);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Bottle> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the bottles where uuid = &#63; and companyId = &#63; from the database.
+	 *
+	 * @param uuid the uuid
+	 * @param companyId the company ID
+	 */
+	@Override
+	public void removeByUuid_C(String uuid, long companyId) {
+		for (Bottle bottle : findByUuid_C(uuid, companyId, QueryUtil.ALL_POS,
+				QueryUtil.ALL_POS, null)) {
+			remove(bottle);
+		}
+	}
+
+	/**
+	 * Returns the number of bottles where uuid = &#63; and companyId = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @param companyId the company ID
+	 * @return the number of matching bottles
+	 */
+	@Override
+	public int countByUuid_C(String uuid, long companyId) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID_C;
+
+		Object[] finderArgs = new Object[] { uuid, companyId };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(3);
+
+			query.append(_SQL_COUNT_BOTTLE_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();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_UUID_C_UUID_1 = "bottle.uuid IS NULL AND ";
+	private static final String _FINDER_COLUMN_UUID_C_UUID_2 = "bottle.uuid = ? AND ";
+	private static final String _FINDER_COLUMN_UUID_C_UUID_3 = "(bottle.uuid IS NULL OR bottle.uuid = '') AND ";
+	private static final String _FINDER_COLUMN_UUID_C_COMPANYID_2 = "bottle.companyId = ?";
+	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_NAME = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByName",
+			new String[] {
+				String.class.getName(),
+				
+			Integer.class.getName(), Integer.class.getName(),
+				OrderByComparator.class.getName()
+			});
+	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByName",
+			new String[] { String.class.getName() },
+			BottleModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_NAME = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByName",
+			new String[] { String.class.getName() });
+
+	/**
+	 * Returns all the bottles where name = &#63;.
+	 *
+	 * @param name the name
+	 * @return the matching bottles
+	 */
+	@Override
+	public List<Bottle> findByName(String name) {
+		return findByName(name, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @return the range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByName(String name, int start, int end) {
+		return findByName(name, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByName(String name, int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return findByName(name, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 name the name
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByName(String name, int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		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_NAME;
+			finderArgs = new Object[] { name };
+		}
+		else {
+			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_NAME;
+			finderArgs = new Object[] { name, start, end, orderByComparator };
+		}
+
+		List<Bottle> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Bottle>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Bottle bottle : list) {
+					if (!Objects.equals(name, bottle.getName())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(3 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(3);
+			}
+
+			query.append(_SQL_SELECT_BOTTLE_WHERE);
+
+			boolean bindName = false;
+
+			if (name == null) {
+				query.append(_FINDER_COLUMN_NAME_NAME_1);
+			}
+			else if (name.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_NAME_NAME_3);
+			}
+			else {
+				bindName = true;
+
+				query.append(_FINDER_COLUMN_NAME_NAME_2);
+			}
+
+			if (orderByComparator != null) {
+				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
+					orderByComparator);
+			}
+			else
+			 if (pagination) {
+				query.append(BottleModelImpl.ORDER_BY_JPQL);
+			}
+
+			String sql = query.toString();
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				QueryPos qPos = QueryPos.getInstance(q);
+
+				if (bindName) {
+					qPos.add(name);
+				}
+
+				if (!pagination) {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first bottle in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the first matching bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByName_First(String name,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByName_First(name, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		StringBundler msg = new StringBundler(4);
+
+		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+		msg.append("name=");
+		msg.append(name);
+
+		msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+		throw new NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the first bottle in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the first matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByName_First(String name,
+		OrderByComparator<Bottle> orderByComparator) {
+		List<Bottle> list = findByName(name, 0, 1, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last bottle in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the last matching bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByName_Last(String name,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByName_Last(name, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		StringBundler msg = new StringBundler(4);
+
+		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+		msg.append("name=");
+		msg.append(name);
+
+		msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+		throw new NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the last bottle in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the last matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByName_Last(String name,
+		OrderByComparator<Bottle> orderByComparator) {
+		int count = countByName(name);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Bottle> list = findByName(name, count - 1, count, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the bottles before and after the current bottle in the ordered set where name = &#63;.
+	 *
+	 * @param bottleId the primary key of the current bottle
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the previous, current, and next bottle
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle[] findByName_PrevAndNext(long bottleId, String name,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = findByPrimaryKey(bottleId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Bottle[] array = new BottleImpl[3];
+
+			array[0] = getByName_PrevAndNext(session, bottle, name,
+					orderByComparator, true);
+
+			array[1] = bottle;
+
+			array[2] = getByName_PrevAndNext(session, bottle, name,
+					orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Bottle getByName_PrevAndNext(Session session, Bottle bottle,
+		String name, OrderByComparator<Bottle> orderByComparator,
+		boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(4 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(3);
+		}
+
+		query.append(_SQL_SELECT_BOTTLE_WHERE);
+
+		boolean bindName = false;
+
+		if (name == null) {
+			query.append(_FINDER_COLUMN_NAME_NAME_1);
+		}
+		else if (name.equals(StringPool.BLANK)) {
+			query.append(_FINDER_COLUMN_NAME_NAME_3);
+		}
+		else {
+			bindName = true;
+
+			query.append(_FINDER_COLUMN_NAME_NAME_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(BottleModelImpl.ORDER_BY_JPQL);
+		}
+
+		String sql = query.toString();
+
+		Query q = session.createQuery(sql);
+
+		q.setFirstResult(0);
+		q.setMaxResults(2);
+
+		QueryPos qPos = QueryPos.getInstance(q);
+
+		if (bindName) {
+			qPos.add(name);
+		}
+
+		if (orderByComparator != null) {
+			Object[] values = orderByComparator.getOrderByConditionValues(bottle);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Bottle> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the bottles where name = &#63; from the database.
+	 *
+	 * @param name the name
+	 */
+	@Override
+	public void removeByName(String name) {
+		for (Bottle bottle : findByName(name, QueryUtil.ALL_POS,
+				QueryUtil.ALL_POS, null)) {
+			remove(bottle);
+		}
+	}
+
+	/**
+	 * Returns the number of bottles where name = &#63;.
+	 *
+	 * @param name the name
+	 * @return the number of matching bottles
+	 */
+	@Override
+	public int countByName(String name) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_NAME;
+
+		Object[] finderArgs = new Object[] { name };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(2);
+
+			query.append(_SQL_COUNT_BOTTLE_WHERE);
+
+			boolean bindName = false;
+
+			if (name == null) {
+				query.append(_FINDER_COLUMN_NAME_NAME_1);
+			}
+			else if (name.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_NAME_NAME_3);
+			}
+			else {
+				bindName = true;
+
+				query.append(_FINDER_COLUMN_NAME_NAME_2);
+			}
+
+			String sql = query.toString();
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				QueryPos qPos = QueryPos.getInstance(q);
+
+				if (bindName) {
+					qPos.add(name);
+				}
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_NAME_NAME_1 = "bottle.name IS NULL";
+	private static final String _FINDER_COLUMN_NAME_NAME_2 = "bottle.name = ?";
+	private static final String _FINDER_COLUMN_NAME_NAME_3 = "(bottle.name IS NULL OR bottle.name = '')";
+	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_RACKID = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByRackId",
+			new String[] {
+				Long.class.getName(),
+				
+			Integer.class.getName(), Integer.class.getName(),
+				OrderByComparator.class.getName()
+			});
+	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_RACKID =
+		new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, BottleImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByRackId",
+			new String[] { Long.class.getName() },
+			BottleModelImpl.RACKID_COLUMN_BITMASK |
+			BottleModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_RACKID = new FinderPath(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByRackId",
+			new String[] { Long.class.getName() });
+
+	/**
+	 * Returns all the bottles where rackId = &#63;.
+	 *
+	 * @param rackId the rack ID
+	 * @return the matching bottles
+	 */
+	@Override
+	public List<Bottle> findByRackId(long rackId) {
+		return findByRackId(rackId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @return the range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByRackId(long rackId, int start, int end) {
+		return findByRackId(rackId, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByRackId(long rackId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return findByRackId(rackId, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles where rackId = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 rackId the rack ID
+	 * @param start the lower bound of the range of bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching bottles
+	 */
+	@Override
+	public List<Bottle> findByRackId(long rackId, int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		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_RACKID;
+			finderArgs = new Object[] { rackId };
+		}
+		else {
+			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_RACKID;
+			finderArgs = new Object[] { rackId, start, end, orderByComparator };
+		}
+
+		List<Bottle> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Bottle>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Bottle bottle : list) {
+					if ((rackId != bottle.getRackId())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(3 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(3);
+			}
+
+			query.append(_SQL_SELECT_BOTTLE_WHERE);
+
+			query.append(_FINDER_COLUMN_RACKID_RACKID_2);
+
+			if (orderByComparator != null) {
+				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
+					orderByComparator);
+			}
+			else
+			 if (pagination) {
+				query.append(BottleModelImpl.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(rackId);
+
+				if (!pagination) {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first bottle in the ordered set where rackId = &#63;.
+	 *
+	 * @param rackId the rack ID
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the first matching bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByRackId_First(long rackId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByRackId_First(rackId, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		StringBundler msg = new StringBundler(4);
+
+		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+		msg.append("rackId=");
+		msg.append(rackId);
+
+		msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+		throw new NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the first bottle in the ordered set where rackId = &#63;.
+	 *
+	 * @param rackId the rack ID
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the first matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByRackId_First(long rackId,
+		OrderByComparator<Bottle> orderByComparator) {
+		List<Bottle> list = findByRackId(rackId, 0, 1, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last bottle in the ordered set where rackId = &#63;.
+	 *
+	 * @param rackId the rack ID
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the last matching bottle
+	 * @throws NoSuchBottleException if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle findByRackId_Last(long rackId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByRackId_Last(rackId, orderByComparator);
+
+		if (bottle != null) {
+			return bottle;
+		}
+
+		StringBundler msg = new StringBundler(4);
+
+		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+		msg.append("rackId=");
+		msg.append(rackId);
+
+		msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+		throw new NoSuchBottleException(msg.toString());
+	}
+
+	/**
+	 * Returns the last bottle in the ordered set where rackId = &#63;.
+	 *
+	 * @param rackId the rack ID
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the last matching bottle, or <code>null</code> if a matching bottle could not be found
+	 */
+	@Override
+	public Bottle fetchByRackId_Last(long rackId,
+		OrderByComparator<Bottle> orderByComparator) {
+		int count = countByRackId(rackId);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Bottle> list = findByRackId(rackId, count - 1, count,
+				orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the bottles before and after the current bottle in the ordered set where rackId = &#63;.
+	 *
+	 * @param bottleId the primary key of the current bottle
+	 * @param rackId the rack ID
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the previous, current, and next bottle
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle[] findByRackId_PrevAndNext(long bottleId, long rackId,
+		OrderByComparator<Bottle> orderByComparator)
+		throws NoSuchBottleException {
+		Bottle bottle = findByPrimaryKey(bottleId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Bottle[] array = new BottleImpl[3];
+
+			array[0] = getByRackId_PrevAndNext(session, bottle, rackId,
+					orderByComparator, true);
+
+			array[1] = bottle;
+
+			array[2] = getByRackId_PrevAndNext(session, bottle, rackId,
+					orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Bottle getByRackId_PrevAndNext(Session session, Bottle bottle,
+		long rackId, OrderByComparator<Bottle> orderByComparator,
+		boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(4 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(3);
+		}
+
+		query.append(_SQL_SELECT_BOTTLE_WHERE);
+
+		query.append(_FINDER_COLUMN_RACKID_RACKID_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(BottleModelImpl.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(rackId);
+
+		if (orderByComparator != null) {
+			Object[] values = orderByComparator.getOrderByConditionValues(bottle);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Bottle> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the bottles where rackId = &#63; from the database.
+	 *
+	 * @param rackId the rack ID
+	 */
+	@Override
+	public void removeByRackId(long rackId) {
+		for (Bottle bottle : findByRackId(rackId, QueryUtil.ALL_POS,
+				QueryUtil.ALL_POS, null)) {
+			remove(bottle);
+		}
+	}
+
+	/**
+	 * Returns the number of bottles where rackId = &#63;.
+	 *
+	 * @param rackId the rack ID
+	 * @return the number of matching bottles
+	 */
+	@Override
+	public int countByRackId(long rackId) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_RACKID;
+
+		Object[] finderArgs = new Object[] { rackId };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(2);
+
+			query.append(_SQL_COUNT_BOTTLE_WHERE);
+
+			query.append(_FINDER_COLUMN_RACKID_RACKID_2);
+
+			String sql = query.toString();
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				QueryPos qPos = QueryPos.getInstance(q);
+
+				qPos.add(rackId);
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_RACKID_RACKID_2 = "bottle.rackId = ?";
+
+	public BottlePersistenceImpl() {
+		setModelClass(Bottle.class);
+	}
+
+	/**
+	 * Caches the bottle in the entity cache if it is enabled.
+	 *
+	 * @param bottle the bottle
+	 */
+	@Override
+	public void cacheResult(Bottle bottle) {
+		entityCache.putResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleImpl.class, bottle.getPrimaryKey(), bottle);
+
+		finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G,
+			new Object[] { bottle.getUuid(), bottle.getGroupId() }, bottle);
+
+		bottle.resetOriginalValues();
+	}
+
+	/**
+	 * Caches the bottles in the entity cache if it is enabled.
+	 *
+	 * @param bottles the bottles
+	 */
+	@Override
+	public void cacheResult(List<Bottle> bottles) {
+		for (Bottle bottle : bottles) {
+			if (entityCache.getResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+						BottleImpl.class, bottle.getPrimaryKey()) == null) {
+				cacheResult(bottle);
+			}
+			else {
+				bottle.resetOriginalValues();
+			}
+		}
+	}
+
+	/**
+	 * Clears the cache for all bottles.
+	 *
+	 * <p>
+	 * The {@link EntityCache} and {@link FinderCache} are both cleared by this method.
+	 * </p>
+	 */
+	@Override
+	public void clearCache() {
+		entityCache.clearCache(BottleImpl.class);
+
+		finderCache.clearCache(FINDER_CLASS_NAME_ENTITY);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+	}
+
+	/**
+	 * Clears the cache for the bottle.
+	 *
+	 * <p>
+	 * The {@link EntityCache} and {@link FinderCache} are both cleared by this method.
+	 * </p>
+	 */
+	@Override
+	public void clearCache(Bottle bottle) {
+		entityCache.removeResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleImpl.class, bottle.getPrimaryKey());
+
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+
+		clearUniqueFindersCache((BottleModelImpl)bottle, true);
+	}
+
+	@Override
+	public void clearCache(List<Bottle> bottles) {
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+
+		for (Bottle bottle : bottles) {
+			entityCache.removeResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+				BottleImpl.class, bottle.getPrimaryKey());
+
+			clearUniqueFindersCache((BottleModelImpl)bottle, true);
+		}
+	}
+
+	protected void cacheUniqueFindersCache(BottleModelImpl bottleModelImpl) {
+		Object[] args = new Object[] {
+				bottleModelImpl.getUuid(), bottleModelImpl.getGroupId()
+			};
+
+		finderCache.putResult(FINDER_PATH_COUNT_BY_UUID_G, args,
+			Long.valueOf(1), false);
+		finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G, args,
+			bottleModelImpl, false);
+	}
+
+	protected void clearUniqueFindersCache(BottleModelImpl bottleModelImpl,
+		boolean clearCurrent) {
+		if (clearCurrent) {
+			Object[] args = new Object[] {
+					bottleModelImpl.getUuid(), bottleModelImpl.getGroupId()
+				};
+
+			finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_G, args);
+			finderCache.removeResult(FINDER_PATH_FETCH_BY_UUID_G, args);
+		}
+
+		if ((bottleModelImpl.getColumnBitmask() &
+				FINDER_PATH_FETCH_BY_UUID_G.getColumnBitmask()) != 0) {
+			Object[] args = new Object[] {
+					bottleModelImpl.getOriginalUuid(),
+					bottleModelImpl.getOriginalGroupId()
+				};
+
+			finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_G, args);
+			finderCache.removeResult(FINDER_PATH_FETCH_BY_UUID_G, args);
+		}
+	}
+
+	/**
+	 * Creates a new bottle with the primary key. Does not add the bottle to the database.
+	 *
+	 * @param bottleId the primary key for the new bottle
+	 * @return the new bottle
+	 */
+	@Override
+	public Bottle create(long bottleId) {
+		Bottle bottle = new BottleImpl();
+
+		bottle.setNew(true);
+		bottle.setPrimaryKey(bottleId);
+
+		String uuid = PortalUUIDUtil.generate();
+
+		bottle.setUuid(uuid);
+
+		bottle.setCompanyId(companyProvider.getCompanyId());
+
+		return bottle;
+	}
+
+	/**
+	 * Removes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param bottleId the primary key of the bottle
+	 * @return the bottle that was removed
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle remove(long bottleId) throws NoSuchBottleException {
+		return remove((Serializable)bottleId);
+	}
+
+	/**
+	 * Removes the bottle with the primary key from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param primaryKey the primary key of the bottle
+	 * @return the bottle that was removed
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle remove(Serializable primaryKey) throws NoSuchBottleException {
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Bottle bottle = (Bottle)session.get(BottleImpl.class, primaryKey);
+
+			if (bottle == null) {
+				if (_log.isDebugEnabled()) {
+					_log.debug(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
+				}
+
+				throw new NoSuchBottleException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
+					primaryKey);
+			}
+
+			return remove(bottle);
+		}
+		catch (NoSuchBottleException nsee) {
+			throw nsee;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	@Override
+	protected Bottle removeImpl(Bottle bottle) {
+		bottle = toUnwrappedModel(bottle);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			if (!session.contains(bottle)) {
+				bottle = (Bottle)session.get(BottleImpl.class,
+						bottle.getPrimaryKeyObj());
+			}
+
+			if (bottle != null) {
+				session.delete(bottle);
+			}
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+
+		if (bottle != null) {
+			clearCache(bottle);
+		}
+
+		return bottle;
+	}
+
+	@Override
+	public Bottle updateImpl(Bottle bottle) {
+		bottle = toUnwrappedModel(bottle);
+
+		boolean isNew = bottle.isNew();
+
+		BottleModelImpl bottleModelImpl = (BottleModelImpl)bottle;
+
+		if (Validator.isNull(bottle.getUuid())) {
+			String uuid = PortalUUIDUtil.generate();
+
+			bottle.setUuid(uuid);
+		}
+
+		ServiceContext serviceContext = ServiceContextThreadLocal.getServiceContext();
+
+		Date now = new Date();
+
+		if (isNew && (bottle.getCreateDate() == null)) {
+			if (serviceContext == null) {
+				bottle.setCreateDate(now);
+			}
+			else {
+				bottle.setCreateDate(serviceContext.getCreateDate(now));
+			}
+		}
+
+		if (!bottleModelImpl.hasSetModifiedDate()) {
+			if (serviceContext == null) {
+				bottle.setModifiedDate(now);
+			}
+			else {
+				bottle.setModifiedDate(serviceContext.getModifiedDate(now));
+			}
+		}
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			if (bottle.isNew()) {
+				session.save(bottle);
+
+				bottle.setNew(false);
+			}
+			else {
+				bottle = (Bottle)session.merge(bottle);
+			}
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+
+		if (isNew || !BottleModelImpl.COLUMN_BITMASK_ENABLED) {
+			finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+		}
+
+		else {
+			if ((bottleModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] { bottleModelImpl.getOriginalUuid() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
+					args);
+
+				args = new Object[] { bottleModelImpl.getUuid() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
+					args);
+			}
+
+			if ((bottleModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] {
+						bottleModelImpl.getOriginalUuid(),
+						bottleModelImpl.getOriginalCompanyId()
+					};
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_C, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C,
+					args);
+
+				args = new Object[] {
+						bottleModelImpl.getUuid(),
+						bottleModelImpl.getCompanyId()
+					};
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_C, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C,
+					args);
+			}
+
+			if ((bottleModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] { bottleModelImpl.getOriginalName() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_NAME, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME,
+					args);
+
+				args = new Object[] { bottleModelImpl.getName() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_NAME, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME,
+					args);
+			}
+
+			if ((bottleModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_RACKID.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] { bottleModelImpl.getOriginalRackId() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_RACKID, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_RACKID,
+					args);
+
+				args = new Object[] { bottleModelImpl.getRackId() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_RACKID, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_RACKID,
+					args);
+			}
+		}
+
+		entityCache.putResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+			BottleImpl.class, bottle.getPrimaryKey(), bottle, false);
+
+		clearUniqueFindersCache(bottleModelImpl, false);
+		cacheUniqueFindersCache(bottleModelImpl);
+
+		bottle.resetOriginalValues();
+
+		return bottle;
+	}
+
+	protected Bottle toUnwrappedModel(Bottle bottle) {
+		if (bottle instanceof BottleImpl) {
+			return bottle;
+		}
+
+		BottleImpl bottleImpl = new BottleImpl();
+
+		bottleImpl.setNew(bottle.isNew());
+		bottleImpl.setPrimaryKey(bottle.getPrimaryKey());
+
+		bottleImpl.setUuid(bottle.getUuid());
+		bottleImpl.setBottleId(bottle.getBottleId());
+		bottleImpl.setGroupId(bottle.getGroupId());
+		bottleImpl.setCompanyId(bottle.getCompanyId());
+		bottleImpl.setUserId(bottle.getUserId());
+		bottleImpl.setUserName(bottle.getUserName());
+		bottleImpl.setCreateDate(bottle.getCreateDate());
+		bottleImpl.setModifiedDate(bottle.getModifiedDate());
+		bottleImpl.setName(bottle.getName());
+		bottleImpl.setFlipped(bottle.isFlipped());
+		bottleImpl.setXcolumn(bottle.getXcolumn());
+		bottleImpl.setYrow(bottle.getYrow());
+		bottleImpl.setType(bottle.getType());
+		bottleImpl.setRackId(bottle.getRackId());
+
+		return bottleImpl;
+	}
+
+	/**
+	 * Returns the bottle with the primary key or throws a {@link com.liferay.portal.kernel.exception.NoSuchModelException} if it could not be found.
+	 *
+	 * @param primaryKey the primary key of the bottle
+	 * @return the bottle
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle findByPrimaryKey(Serializable primaryKey)
+		throws NoSuchBottleException {
+		Bottle bottle = fetchByPrimaryKey(primaryKey);
+
+		if (bottle == null) {
+			if (_log.isDebugEnabled()) {
+				_log.debug(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
+			}
+
+			throw new NoSuchBottleException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
+				primaryKey);
+		}
+
+		return bottle;
+	}
+
+	/**
+	 * Returns the bottle with the primary key or throws a {@link NoSuchBottleException} if it could not be found.
+	 *
+	 * @param bottleId the primary key of the bottle
+	 * @return the bottle
+	 * @throws NoSuchBottleException if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle findByPrimaryKey(long bottleId) throws NoSuchBottleException {
+		return findByPrimaryKey((Serializable)bottleId);
+	}
+
+	/**
+	 * Returns the bottle with the primary key or returns <code>null</code> if it could not be found.
+	 *
+	 * @param primaryKey the primary key of the bottle
+	 * @return the bottle, or <code>null</code> if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle fetchByPrimaryKey(Serializable primaryKey) {
+		Serializable serializable = entityCache.getResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+				BottleImpl.class, primaryKey);
+
+		if (serializable == nullModel) {
+			return null;
+		}
+
+		Bottle bottle = (Bottle)serializable;
+
+		if (bottle == null) {
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				bottle = (Bottle)session.get(BottleImpl.class, primaryKey);
+
+				if (bottle != null) {
+					cacheResult(bottle);
+				}
+				else {
+					entityCache.putResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+						BottleImpl.class, primaryKey, nullModel);
+				}
+			}
+			catch (Exception e) {
+				entityCache.removeResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+					BottleImpl.class, primaryKey);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return bottle;
+	}
+
+	/**
+	 * Returns the bottle with the primary key or returns <code>null</code> if it could not be found.
+	 *
+	 * @param bottleId the primary key of the bottle
+	 * @return the bottle, or <code>null</code> if a bottle with the primary key could not be found
+	 */
+	@Override
+	public Bottle fetchByPrimaryKey(long bottleId) {
+		return fetchByPrimaryKey((Serializable)bottleId);
+	}
+
+	@Override
+	public Map<Serializable, Bottle> fetchByPrimaryKeys(
+		Set<Serializable> primaryKeys) {
+		if (primaryKeys.isEmpty()) {
+			return Collections.emptyMap();
+		}
+
+		Map<Serializable, Bottle> map = new HashMap<Serializable, Bottle>();
+
+		if (primaryKeys.size() == 1) {
+			Iterator<Serializable> iterator = primaryKeys.iterator();
+
+			Serializable primaryKey = iterator.next();
+
+			Bottle bottle = fetchByPrimaryKey(primaryKey);
+
+			if (bottle != null) {
+				map.put(primaryKey, bottle);
+			}
+
+			return map;
+		}
+
+		Set<Serializable> uncachedPrimaryKeys = null;
+
+		for (Serializable primaryKey : primaryKeys) {
+			Serializable serializable = entityCache.getResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+					BottleImpl.class, primaryKey);
+
+			if (serializable != nullModel) {
+				if (serializable == null) {
+					if (uncachedPrimaryKeys == null) {
+						uncachedPrimaryKeys = new HashSet<Serializable>();
+					}
+
+					uncachedPrimaryKeys.add(primaryKey);
+				}
+				else {
+					map.put(primaryKey, (Bottle)serializable);
+				}
+			}
+		}
+
+		if (uncachedPrimaryKeys == null) {
+			return map;
+		}
+
+		StringBundler query = new StringBundler((uncachedPrimaryKeys.size() * 2) +
+				1);
+
+		query.append(_SQL_SELECT_BOTTLE_WHERE_PKS_IN);
+
+		for (Serializable primaryKey : uncachedPrimaryKeys) {
+			query.append(String.valueOf(primaryKey));
+
+			query.append(StringPool.COMMA);
+		}
+
+		query.setIndex(query.index() - 1);
+
+		query.append(StringPool.CLOSE_PARENTHESIS);
+
+		String sql = query.toString();
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Query q = session.createQuery(sql);
+
+			for (Bottle bottle : (List<Bottle>)q.list()) {
+				map.put(bottle.getPrimaryKeyObj(), bottle);
+
+				cacheResult(bottle);
+
+				uncachedPrimaryKeys.remove(bottle.getPrimaryKeyObj());
+			}
+
+			for (Serializable primaryKey : uncachedPrimaryKeys) {
+				entityCache.putResult(BottleModelImpl.ENTITY_CACHE_ENABLED,
+					BottleImpl.class, primaryKey, nullModel);
+			}
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+
+		return map;
+	}
+
+	/**
+	 * Returns all the bottles.
+	 *
+	 * @return the bottles
+	 */
+	@Override
+	public List<Bottle> findAll() {
+		return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the bottles.
+	 *
+	 * <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @return the range of bottles
+	 */
+	@Override
+	public List<Bottle> findAll(int start, int end) {
+		return findAll(start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles.
+	 *
+	 * <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of bottles
+	 */
+	@Override
+	public List<Bottle> findAll(int start, int end,
+		OrderByComparator<Bottle> orderByComparator) {
+		return findAll(start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the bottles.
+	 *
+	 * <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link BottleModelImpl}. 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 bottles
+	 * @param end the upper bound of the range of bottles (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of bottles
+	 */
+	@Override
+	public List<Bottle> findAll(int start, int end,
+		OrderByComparator<Bottle> orderByComparator, boolean retrieveFromCache) {
+		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<Bottle> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Bottle>)finderCache.getResult(finderPath, finderArgs,
+					this);
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+			String sql = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(2 +
+						(orderByComparator.getOrderByFields().length * 2));
+
+				query.append(_SQL_SELECT_BOTTLE);
+
+				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
+					orderByComparator);
+
+				sql = query.toString();
+			}
+			else {
+				sql = _SQL_SELECT_BOTTLE;
+
+				if (pagination) {
+					sql = sql.concat(BottleModelImpl.ORDER_BY_JPQL);
+				}
+			}
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				if (!pagination) {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Bottle>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Removes all the bottles from the database.
+	 *
+	 */
+	@Override
+	public void removeAll() {
+		for (Bottle bottle : findAll()) {
+			remove(bottle);
+		}
+	}
+
+	/**
+	 * Returns the number of bottles.
+	 *
+	 * @return the number of bottles
+	 */
+	@Override
+	public int countAll() {
+		Long count = (Long)finderCache.getResult(FINDER_PATH_COUNT_ALL,
+				FINDER_ARGS_EMPTY, this);
+
+		if (count == null) {
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(_SQL_COUNT_BOTTLE);
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(FINDER_PATH_COUNT_ALL, FINDER_ARGS_EMPTY,
+					count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(FINDER_PATH_COUNT_ALL,
+					FINDER_ARGS_EMPTY);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	@Override
+	public Set<String> getBadColumnNames() {
+		return _badColumnNames;
+	}
+
+	@Override
+	protected Map<String, Integer> getTableColumnsMap() {
+		return BottleModelImpl.TABLE_COLUMNS_MAP;
+	}
+
+	/**
+	 * Initializes the bottle persistence.
+	 */
+	public void afterPropertiesSet() {
+	}
+
+	public void destroy() {
+		entityCache.removeCache(BottleImpl.class.getName());
+		finderCache.removeCache(FINDER_CLASS_NAME_ENTITY);
+		finderCache.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+	}
+
+	@ServiceReference(type = CompanyProviderWrapper.class)
+	protected CompanyProvider companyProvider;
+	@ServiceReference(type = EntityCache.class)
+	protected EntityCache entityCache;
+	@ServiceReference(type = FinderCache.class)
+	protected FinderCache finderCache;
+	private static final String _SQL_SELECT_BOTTLE = "SELECT bottle FROM Bottle bottle";
+	private static final String _SQL_SELECT_BOTTLE_WHERE_PKS_IN = "SELECT bottle FROM Bottle bottle WHERE bottleId IN (";
+	private static final String _SQL_SELECT_BOTTLE_WHERE = "SELECT bottle FROM Bottle bottle WHERE ";
+	private static final String _SQL_COUNT_BOTTLE = "SELECT COUNT(bottle) FROM Bottle bottle";
+	private static final String _SQL_COUNT_BOTTLE_WHERE = "SELECT COUNT(bottle) FROM Bottle bottle WHERE ";
+	private static final String _ORDER_BY_ENTITY_ALIAS = "bottle.";
+	private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No Bottle exists with the primary key ";
+	private static final String _NO_SUCH_ENTITY_WITH_KEY = "No Bottle exists with the key {";
+	private static final Log _log = LogFactoryUtil.getLog(BottlePersistenceImpl.class);
+	private static final Set<String> _badColumnNames = SetUtil.fromArray(new String[] {
+				"uuid", "type"
+			});
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/persistence/impl/RackPersistenceImpl.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/persistence/impl/RackPersistenceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..1942f46ecd851a811b0c75e262c84485ea679a21
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/persistence/impl/RackPersistenceImpl.java
@@ -0,0 +1,2799 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.persistence.impl;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.dao.orm.EntityCache;
+import com.liferay.portal.kernel.dao.orm.FinderCache;
+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.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.service.ServiceContext;
+import com.liferay.portal.kernel.service.ServiceContextThreadLocal;
+import com.liferay.portal.kernel.service.persistence.CompanyProvider;
+import com.liferay.portal.kernel.service.persistence.CompanyProviderWrapper;
+import com.liferay.portal.kernel.service.persistence.impl.BasePersistenceImpl;
+import com.liferay.portal.kernel.util.OrderByComparator;
+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.Validator;
+import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
+import com.liferay.portal.spring.extender.service.ServiceReference;
+
+import fr.ippon.services.embercellar.exception.NoSuchRackException;
+import fr.ippon.services.embercellar.model.Rack;
+import fr.ippon.services.embercellar.model.impl.RackImpl;
+import fr.ippon.services.embercellar.model.impl.RackModelImpl;
+import fr.ippon.services.embercellar.service.persistence.RackPersistence;
+
+import java.io.Serializable;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * The persistence implementation for the rack service.
+ *
+ * <p>
+ * Caching information and settings can be found in <code>portal.properties</code>
+ * </p>
+ *
+ * @author Brian Wing Shun Chan
+ * @see RackPersistence
+ * @see fr.ippon.services.embercellar.service.persistence.RackUtil
+ * @generated
+ */
+@ProviderType
+public class RackPersistenceImpl extends BasePersistenceImpl<Rack>
+	implements RackPersistence {
+	/*
+	 * NOTE FOR DEVELOPERS:
+	 *
+	 * Never modify or reference this class directly. Always use {@link RackUtil} to access the rack persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
+	 */
+	public static final String FINDER_CLASS_NAME_ENTITY = RackImpl.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(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findAll", new String[0]);
+	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findAll", new String[0]);
+	public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.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(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.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(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid",
+			new String[] { String.class.getName() },
+			RackModelImpl.UUID_COLUMN_BITMASK |
+			RackModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_UUID = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid",
+			new String[] { String.class.getName() });
+
+	/**
+	 * Returns all the racks where uuid = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @return the matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid(String uuid) {
+		return findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @return the range of matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid(String uuid, int start, int end) {
+		return findByUuid(uuid, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid(String uuid, int start, int end,
+		OrderByComparator<Rack> orderByComparator) {
+		return findByUuid(uuid, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid(String uuid, int start, int end,
+		OrderByComparator<Rack> orderByComparator, boolean retrieveFromCache) {
+		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<Rack> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Rack>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Rack rack : list) {
+					if (!Objects.equals(uuid, rack.getUuid())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(3 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(3);
+			}
+
+			query.append(_SQL_SELECT_RACK_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(RackModelImpl.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<Rack>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Rack>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first rack 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 rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByUuid_First(String uuid,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = fetchByUuid_First(uuid, orderByComparator);
+
+		if (rack != null) {
+			return rack;
+		}
+
+		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 NoSuchRackException(msg.toString());
+	}
+
+	/**
+	 * Returns the first rack 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 rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByUuid_First(String uuid,
+		OrderByComparator<Rack> orderByComparator) {
+		List<Rack> list = findByUuid(uuid, 0, 1, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last rack 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 rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByUuid_Last(String uuid,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = fetchByUuid_Last(uuid, orderByComparator);
+
+		if (rack != null) {
+			return rack;
+		}
+
+		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 NoSuchRackException(msg.toString());
+	}
+
+	/**
+	 * Returns the last rack 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 rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByUuid_Last(String uuid,
+		OrderByComparator<Rack> orderByComparator) {
+		int count = countByUuid(uuid);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Rack> list = findByUuid(uuid, count - 1, count, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the racks before and after the current rack in the ordered set where uuid = &#63;.
+	 *
+	 * @param rackId the primary key of the current rack
+	 * @param uuid the uuid
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the previous, current, and next rack
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack[] findByUuid_PrevAndNext(long rackId, String uuid,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = findByPrimaryKey(rackId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Rack[] array = new RackImpl[3];
+
+			array[0] = getByUuid_PrevAndNext(session, rack, uuid,
+					orderByComparator, true);
+
+			array[1] = rack;
+
+			array[2] = getByUuid_PrevAndNext(session, rack, uuid,
+					orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Rack getByUuid_PrevAndNext(Session session, Rack rack,
+		String uuid, OrderByComparator<Rack> orderByComparator, boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(4 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(3);
+		}
+
+		query.append(_SQL_SELECT_RACK_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(RackModelImpl.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(rack);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Rack> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the racks where uuid = &#63; from the database.
+	 *
+	 * @param uuid the uuid
+	 */
+	@Override
+	public void removeByUuid(String uuid) {
+		for (Rack rack : findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
+				null)) {
+			remove(rack);
+		}
+	}
+
+	/**
+	 * Returns the number of racks where uuid = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @return the number of matching racks
+	 */
+	@Override
+	public int countByUuid(String uuid) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID;
+
+		Object[] finderArgs = new Object[] { uuid };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(2);
+
+			query.append(_SQL_COUNT_RACK_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();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_UUID_UUID_1 = "rack.uuid IS NULL";
+	private static final String _FINDER_COLUMN_UUID_UUID_2 = "rack.uuid = ?";
+	private static final String _FINDER_COLUMN_UUID_UUID_3 = "(rack.uuid IS NULL OR rack.uuid = '')";
+	public static final FinderPath FINDER_PATH_FETCH_BY_UUID_G = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_ENTITY, "fetchByUUID_G",
+			new String[] { String.class.getName(), Long.class.getName() },
+			RackModelImpl.UUID_COLUMN_BITMASK |
+			RackModelImpl.GROUPID_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_UUID_G = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUUID_G",
+			new String[] { String.class.getName(), Long.class.getName() });
+
+	/**
+	 * Returns the rack where uuid = &#63; and groupId = &#63; or throws a {@link NoSuchRackException} if it could not be found.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the matching rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByUUID_G(String uuid, long groupId)
+		throws NoSuchRackException {
+		Rack rack = fetchByUUID_G(uuid, groupId);
+
+		if (rack == null) {
+			StringBundler msg = new StringBundler(6);
+
+			msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+			msg.append("uuid=");
+			msg.append(uuid);
+
+			msg.append(", groupId=");
+			msg.append(groupId);
+
+			msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+			if (_log.isDebugEnabled()) {
+				_log.debug(msg.toString());
+			}
+
+			throw new NoSuchRackException(msg.toString());
+		}
+
+		return rack;
+	}
+
+	/**
+	 * Returns the rack where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found. Uses the finder cache.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the matching rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByUUID_G(String uuid, long groupId) {
+		return fetchByUUID_G(uuid, groupId, true);
+	}
+
+	/**
+	 * Returns the rack where uuid = &#63; and groupId = &#63; or returns <code>null</code> if it could not be found, optionally using the finder cache.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the matching rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByUUID_G(String uuid, long groupId,
+		boolean retrieveFromCache) {
+		Object[] finderArgs = new Object[] { uuid, groupId };
+
+		Object result = null;
+
+		if (retrieveFromCache) {
+			result = finderCache.getResult(FINDER_PATH_FETCH_BY_UUID_G,
+					finderArgs, this);
+		}
+
+		if (result instanceof Rack) {
+			Rack rack = (Rack)result;
+
+			if (!Objects.equals(uuid, rack.getUuid()) ||
+					(groupId != rack.getGroupId())) {
+				result = null;
+			}
+		}
+
+		if (result == null) {
+			StringBundler query = new StringBundler(4);
+
+			query.append(_SQL_SELECT_RACK_WHERE);
+
+			boolean bindUuid = false;
+
+			if (uuid == null) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_1);
+			}
+			else if (uuid.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_3);
+			}
+			else {
+				bindUuid = true;
+
+				query.append(_FINDER_COLUMN_UUID_G_UUID_2);
+			}
+
+			query.append(_FINDER_COLUMN_UUID_G_GROUPID_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(groupId);
+
+				List<Rack> list = q.list();
+
+				if (list.isEmpty()) {
+					finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G,
+						finderArgs, list);
+				}
+				else {
+					Rack rack = list.get(0);
+
+					result = rack;
+
+					cacheResult(rack);
+
+					if ((rack.getUuid() == null) ||
+							!rack.getUuid().equals(uuid) ||
+							(rack.getGroupId() != groupId)) {
+						finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G,
+							finderArgs, rack);
+					}
+				}
+			}
+			catch (Exception e) {
+				finderCache.removeResult(FINDER_PATH_FETCH_BY_UUID_G, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		if (result instanceof List<?>) {
+			return null;
+		}
+		else {
+			return (Rack)result;
+		}
+	}
+
+	/**
+	 * Removes the rack where uuid = &#63; and groupId = &#63; from the database.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the rack that was removed
+	 */
+	@Override
+	public Rack removeByUUID_G(String uuid, long groupId)
+		throws NoSuchRackException {
+		Rack rack = findByUUID_G(uuid, groupId);
+
+		return remove(rack);
+	}
+
+	/**
+	 * Returns the number of racks where uuid = &#63; and groupId = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @param groupId the group ID
+	 * @return the number of matching racks
+	 */
+	@Override
+	public int countByUUID_G(String uuid, long groupId) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID_G;
+
+		Object[] finderArgs = new Object[] { uuid, groupId };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(3);
+
+			query.append(_SQL_COUNT_RACK_WHERE);
+
+			boolean bindUuid = false;
+
+			if (uuid == null) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_1);
+			}
+			else if (uuid.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_UUID_G_UUID_3);
+			}
+			else {
+				bindUuid = true;
+
+				query.append(_FINDER_COLUMN_UUID_G_UUID_2);
+			}
+
+			query.append(_FINDER_COLUMN_UUID_G_GROUPID_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(groupId);
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_UUID_G_UUID_1 = "rack.uuid IS NULL AND ";
+	private static final String _FINDER_COLUMN_UUID_G_UUID_2 = "rack.uuid = ? AND ";
+	private static final String _FINDER_COLUMN_UUID_G_UUID_3 = "(rack.uuid IS NULL OR rack.uuid = '') AND ";
+	private static final String _FINDER_COLUMN_UUID_G_GROUPID_2 = "rack.groupId = ?";
+	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID_C = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.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(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid_C",
+			new String[] { String.class.getName(), Long.class.getName() },
+			RackModelImpl.UUID_COLUMN_BITMASK |
+			RackModelImpl.COMPANYID_COLUMN_BITMASK |
+			RackModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_UUID_C = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid_C",
+			new String[] { String.class.getName(), Long.class.getName() });
+
+	/**
+	 * Returns all the racks where uuid = &#63; and companyId = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @param companyId the company ID
+	 * @return the matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid_C(String uuid, long companyId) {
+		return findByUuid_C(uuid, companyId, QueryUtil.ALL_POS,
+			QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @return the range of matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid_C(String uuid, long companyId, int start,
+		int end) {
+		return findByUuid_C(uuid, companyId, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid_C(String uuid, long companyId, int start,
+		int end, OrderByComparator<Rack> orderByComparator) {
+		return findByUuid_C(uuid, companyId, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks 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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching racks
+	 */
+	@Override
+	public List<Rack> findByUuid_C(String uuid, long companyId, int start,
+		int end, OrderByComparator<Rack> orderByComparator,
+		boolean retrieveFromCache) {
+		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<Rack> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Rack>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Rack rack : list) {
+					if (!Objects.equals(uuid, rack.getUuid()) ||
+							(companyId != rack.getCompanyId())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(4 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(4);
+			}
+
+			query.append(_SQL_SELECT_RACK_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(RackModelImpl.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<Rack>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Rack>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first rack 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 rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByUuid_C_First(String uuid, long companyId,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = fetchByUuid_C_First(uuid, companyId, orderByComparator);
+
+		if (rack != null) {
+			return rack;
+		}
+
+		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 NoSuchRackException(msg.toString());
+	}
+
+	/**
+	 * Returns the first rack 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 rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByUuid_C_First(String uuid, long companyId,
+		OrderByComparator<Rack> orderByComparator) {
+		List<Rack> list = findByUuid_C(uuid, companyId, 0, 1, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last rack 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 rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByUuid_C_Last(String uuid, long companyId,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = fetchByUuid_C_Last(uuid, companyId, orderByComparator);
+
+		if (rack != null) {
+			return rack;
+		}
+
+		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 NoSuchRackException(msg.toString());
+	}
+
+	/**
+	 * Returns the last rack 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 rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByUuid_C_Last(String uuid, long companyId,
+		OrderByComparator<Rack> orderByComparator) {
+		int count = countByUuid_C(uuid, companyId);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Rack> list = findByUuid_C(uuid, companyId, count - 1, count,
+				orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the racks before and after the current rack in the ordered set where uuid = &#63; and companyId = &#63;.
+	 *
+	 * @param rackId the primary key of the current rack
+	 * @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 rack
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack[] findByUuid_C_PrevAndNext(long rackId, String uuid,
+		long companyId, OrderByComparator<Rack> orderByComparator)
+		throws NoSuchRackException {
+		Rack rack = findByPrimaryKey(rackId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Rack[] array = new RackImpl[3];
+
+			array[0] = getByUuid_C_PrevAndNext(session, rack, uuid, companyId,
+					orderByComparator, true);
+
+			array[1] = rack;
+
+			array[2] = getByUuid_C_PrevAndNext(session, rack, uuid, companyId,
+					orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Rack getByUuid_C_PrevAndNext(Session session, Rack rack,
+		String uuid, long companyId, OrderByComparator<Rack> orderByComparator,
+		boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(5 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(4);
+		}
+
+		query.append(_SQL_SELECT_RACK_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(RackModelImpl.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(rack);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Rack> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the racks where uuid = &#63; and companyId = &#63; from the database.
+	 *
+	 * @param uuid the uuid
+	 * @param companyId the company ID
+	 */
+	@Override
+	public void removeByUuid_C(String uuid, long companyId) {
+		for (Rack rack : findByUuid_C(uuid, companyId, QueryUtil.ALL_POS,
+				QueryUtil.ALL_POS, null)) {
+			remove(rack);
+		}
+	}
+
+	/**
+	 * Returns the number of racks where uuid = &#63; and companyId = &#63;.
+	 *
+	 * @param uuid the uuid
+	 * @param companyId the company ID
+	 * @return the number of matching racks
+	 */
+	@Override
+	public int countByUuid_C(String uuid, long companyId) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID_C;
+
+		Object[] finderArgs = new Object[] { uuid, companyId };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(3);
+
+			query.append(_SQL_COUNT_RACK_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();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_UUID_C_UUID_1 = "rack.uuid IS NULL AND ";
+	private static final String _FINDER_COLUMN_UUID_C_UUID_2 = "rack.uuid = ? AND ";
+	private static final String _FINDER_COLUMN_UUID_C_UUID_3 = "(rack.uuid IS NULL OR rack.uuid = '') AND ";
+	private static final String _FINDER_COLUMN_UUID_C_COMPANYID_2 = "rack.companyId = ?";
+	public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_NAME = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_LIST_WITH_PAGINATION, "findByName",
+			new String[] {
+				String.class.getName(),
+				
+			Integer.class.getName(), Integer.class.getName(),
+				OrderByComparator.class.getName()
+			});
+	public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, RackImpl.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByName",
+			new String[] { String.class.getName() },
+			RackModelImpl.NAME_COLUMN_BITMASK);
+	public static final FinderPath FINDER_PATH_COUNT_BY_NAME = new FinderPath(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackModelImpl.FINDER_CACHE_ENABLED, Long.class,
+			FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByName",
+			new String[] { String.class.getName() });
+
+	/**
+	 * Returns all the racks where name = &#63;.
+	 *
+	 * @param name the name
+	 * @return the matching racks
+	 */
+	@Override
+	public List<Rack> findByName(String name) {
+		return findByName(name, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	 * @param start the lower bound of the range of racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @return the range of matching racks
+	 */
+	@Override
+	public List<Rack> findByName(String name, int start, int end) {
+		return findByName(name, start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	 * @param start the lower bound of the range of racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of matching racks
+	 */
+	@Override
+	public List<Rack> findByName(String name, int start, int end,
+		OrderByComparator<Rack> orderByComparator) {
+		return findByName(name, start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks where name = &#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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 name the name
+	 * @param start the lower bound of the range of racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of matching racks
+	 */
+	@Override
+	public List<Rack> findByName(String name, int start, int end,
+		OrderByComparator<Rack> orderByComparator, boolean retrieveFromCache) {
+		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_NAME;
+			finderArgs = new Object[] { name };
+		}
+		else {
+			finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_NAME;
+			finderArgs = new Object[] { name, start, end, orderByComparator };
+		}
+
+		List<Rack> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Rack>)finderCache.getResult(finderPath, finderArgs,
+					this);
+
+			if ((list != null) && !list.isEmpty()) {
+				for (Rack rack : list) {
+					if (!Objects.equals(name, rack.getName())) {
+						list = null;
+
+						break;
+					}
+				}
+			}
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(3 +
+						(orderByComparator.getOrderByFields().length * 2));
+			}
+			else {
+				query = new StringBundler(3);
+			}
+
+			query.append(_SQL_SELECT_RACK_WHERE);
+
+			boolean bindName = false;
+
+			if (name == null) {
+				query.append(_FINDER_COLUMN_NAME_NAME_1);
+			}
+			else if (name.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_NAME_NAME_3);
+			}
+			else {
+				bindName = true;
+
+				query.append(_FINDER_COLUMN_NAME_NAME_2);
+			}
+
+			if (orderByComparator != null) {
+				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
+					orderByComparator);
+			}
+			else
+			 if (pagination) {
+				query.append(RackModelImpl.ORDER_BY_JPQL);
+			}
+
+			String sql = query.toString();
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				QueryPos qPos = QueryPos.getInstance(q);
+
+				if (bindName) {
+					qPos.add(name);
+				}
+
+				if (!pagination) {
+					list = (List<Rack>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Rack>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Returns the first rack in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the first matching rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByName_First(String name,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = fetchByName_First(name, orderByComparator);
+
+		if (rack != null) {
+			return rack;
+		}
+
+		StringBundler msg = new StringBundler(4);
+
+		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+		msg.append("name=");
+		msg.append(name);
+
+		msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+		throw new NoSuchRackException(msg.toString());
+	}
+
+	/**
+	 * Returns the first rack in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the first matching rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByName_First(String name,
+		OrderByComparator<Rack> orderByComparator) {
+		List<Rack> list = findByName(name, 0, 1, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the last rack in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the last matching rack
+	 * @throws NoSuchRackException if a matching rack could not be found
+	 */
+	@Override
+	public Rack findByName_Last(String name,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = fetchByName_Last(name, orderByComparator);
+
+		if (rack != null) {
+			return rack;
+		}
+
+		StringBundler msg = new StringBundler(4);
+
+		msg.append(_NO_SUCH_ENTITY_WITH_KEY);
+
+		msg.append("name=");
+		msg.append(name);
+
+		msg.append(StringPool.CLOSE_CURLY_BRACE);
+
+		throw new NoSuchRackException(msg.toString());
+	}
+
+	/**
+	 * Returns the last rack in the ordered set where name = &#63;.
+	 *
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the last matching rack, or <code>null</code> if a matching rack could not be found
+	 */
+	@Override
+	public Rack fetchByName_Last(String name,
+		OrderByComparator<Rack> orderByComparator) {
+		int count = countByName(name);
+
+		if (count == 0) {
+			return null;
+		}
+
+		List<Rack> list = findByName(name, count - 1, count, orderByComparator);
+
+		if (!list.isEmpty()) {
+			return list.get(0);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the racks before and after the current rack in the ordered set where name = &#63;.
+	 *
+	 * @param rackId the primary key of the current rack
+	 * @param name the name
+	 * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
+	 * @return the previous, current, and next rack
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack[] findByName_PrevAndNext(long rackId, String name,
+		OrderByComparator<Rack> orderByComparator) throws NoSuchRackException {
+		Rack rack = findByPrimaryKey(rackId);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Rack[] array = new RackImpl[3];
+
+			array[0] = getByName_PrevAndNext(session, rack, name,
+					orderByComparator, true);
+
+			array[1] = rack;
+
+			array[2] = getByName_PrevAndNext(session, rack, name,
+					orderByComparator, false);
+
+			return array;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	protected Rack getByName_PrevAndNext(Session session, Rack rack,
+		String name, OrderByComparator<Rack> orderByComparator, boolean previous) {
+		StringBundler query = null;
+
+		if (orderByComparator != null) {
+			query = new StringBundler(4 +
+					(orderByComparator.getOrderByConditionFields().length * 3) +
+					(orderByComparator.getOrderByFields().length * 3));
+		}
+		else {
+			query = new StringBundler(3);
+		}
+
+		query.append(_SQL_SELECT_RACK_WHERE);
+
+		boolean bindName = false;
+
+		if (name == null) {
+			query.append(_FINDER_COLUMN_NAME_NAME_1);
+		}
+		else if (name.equals(StringPool.BLANK)) {
+			query.append(_FINDER_COLUMN_NAME_NAME_3);
+		}
+		else {
+			bindName = true;
+
+			query.append(_FINDER_COLUMN_NAME_NAME_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(RackModelImpl.ORDER_BY_JPQL);
+		}
+
+		String sql = query.toString();
+
+		Query q = session.createQuery(sql);
+
+		q.setFirstResult(0);
+		q.setMaxResults(2);
+
+		QueryPos qPos = QueryPos.getInstance(q);
+
+		if (bindName) {
+			qPos.add(name);
+		}
+
+		if (orderByComparator != null) {
+			Object[] values = orderByComparator.getOrderByConditionValues(rack);
+
+			for (Object value : values) {
+				qPos.add(value);
+			}
+		}
+
+		List<Rack> list = q.list();
+
+		if (list.size() == 2) {
+			return list.get(1);
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Removes all the racks where name = &#63; from the database.
+	 *
+	 * @param name the name
+	 */
+	@Override
+	public void removeByName(String name) {
+		for (Rack rack : findByName(name, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
+				null)) {
+			remove(rack);
+		}
+	}
+
+	/**
+	 * Returns the number of racks where name = &#63;.
+	 *
+	 * @param name the name
+	 * @return the number of matching racks
+	 */
+	@Override
+	public int countByName(String name) {
+		FinderPath finderPath = FINDER_PATH_COUNT_BY_NAME;
+
+		Object[] finderArgs = new Object[] { name };
+
+		Long count = (Long)finderCache.getResult(finderPath, finderArgs, this);
+
+		if (count == null) {
+			StringBundler query = new StringBundler(2);
+
+			query.append(_SQL_COUNT_RACK_WHERE);
+
+			boolean bindName = false;
+
+			if (name == null) {
+				query.append(_FINDER_COLUMN_NAME_NAME_1);
+			}
+			else if (name.equals(StringPool.BLANK)) {
+				query.append(_FINDER_COLUMN_NAME_NAME_3);
+			}
+			else {
+				bindName = true;
+
+				query.append(_FINDER_COLUMN_NAME_NAME_2);
+			}
+
+			String sql = query.toString();
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				QueryPos qPos = QueryPos.getInstance(q);
+
+				if (bindName) {
+					qPos.add(name);
+				}
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(finderPath, finderArgs, count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	private static final String _FINDER_COLUMN_NAME_NAME_1 = "rack.name IS NULL";
+	private static final String _FINDER_COLUMN_NAME_NAME_2 = "rack.name = ?";
+	private static final String _FINDER_COLUMN_NAME_NAME_3 = "(rack.name IS NULL OR rack.name = '')";
+
+	public RackPersistenceImpl() {
+		setModelClass(Rack.class);
+	}
+
+	/**
+	 * Caches the rack in the entity cache if it is enabled.
+	 *
+	 * @param rack the rack
+	 */
+	@Override
+	public void cacheResult(Rack rack) {
+		entityCache.putResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackImpl.class, rack.getPrimaryKey(), rack);
+
+		finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G,
+			new Object[] { rack.getUuid(), rack.getGroupId() }, rack);
+
+		rack.resetOriginalValues();
+	}
+
+	/**
+	 * Caches the racks in the entity cache if it is enabled.
+	 *
+	 * @param racks the racks
+	 */
+	@Override
+	public void cacheResult(List<Rack> racks) {
+		for (Rack rack : racks) {
+			if (entityCache.getResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+						RackImpl.class, rack.getPrimaryKey()) == null) {
+				cacheResult(rack);
+			}
+			else {
+				rack.resetOriginalValues();
+			}
+		}
+	}
+
+	/**
+	 * Clears the cache for all racks.
+	 *
+	 * <p>
+	 * The {@link EntityCache} and {@link FinderCache} are both cleared by this method.
+	 * </p>
+	 */
+	@Override
+	public void clearCache() {
+		entityCache.clearCache(RackImpl.class);
+
+		finderCache.clearCache(FINDER_CLASS_NAME_ENTITY);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+	}
+
+	/**
+	 * Clears the cache for the rack.
+	 *
+	 * <p>
+	 * The {@link EntityCache} and {@link FinderCache} are both cleared by this method.
+	 * </p>
+	 */
+	@Override
+	public void clearCache(Rack rack) {
+		entityCache.removeResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackImpl.class, rack.getPrimaryKey());
+
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+
+		clearUniqueFindersCache((RackModelImpl)rack, true);
+	}
+
+	@Override
+	public void clearCache(List<Rack> racks) {
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+
+		for (Rack rack : racks) {
+			entityCache.removeResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+				RackImpl.class, rack.getPrimaryKey());
+
+			clearUniqueFindersCache((RackModelImpl)rack, true);
+		}
+	}
+
+	protected void cacheUniqueFindersCache(RackModelImpl rackModelImpl) {
+		Object[] args = new Object[] {
+				rackModelImpl.getUuid(), rackModelImpl.getGroupId()
+			};
+
+		finderCache.putResult(FINDER_PATH_COUNT_BY_UUID_G, args,
+			Long.valueOf(1), false);
+		finderCache.putResult(FINDER_PATH_FETCH_BY_UUID_G, args, rackModelImpl,
+			false);
+	}
+
+	protected void clearUniqueFindersCache(RackModelImpl rackModelImpl,
+		boolean clearCurrent) {
+		if (clearCurrent) {
+			Object[] args = new Object[] {
+					rackModelImpl.getUuid(), rackModelImpl.getGroupId()
+				};
+
+			finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_G, args);
+			finderCache.removeResult(FINDER_PATH_FETCH_BY_UUID_G, args);
+		}
+
+		if ((rackModelImpl.getColumnBitmask() &
+				FINDER_PATH_FETCH_BY_UUID_G.getColumnBitmask()) != 0) {
+			Object[] args = new Object[] {
+					rackModelImpl.getOriginalUuid(),
+					rackModelImpl.getOriginalGroupId()
+				};
+
+			finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_G, args);
+			finderCache.removeResult(FINDER_PATH_FETCH_BY_UUID_G, args);
+		}
+	}
+
+	/**
+	 * Creates a new rack with the primary key. Does not add the rack to the database.
+	 *
+	 * @param rackId the primary key for the new rack
+	 * @return the new rack
+	 */
+	@Override
+	public Rack create(long rackId) {
+		Rack rack = new RackImpl();
+
+		rack.setNew(true);
+		rack.setPrimaryKey(rackId);
+
+		String uuid = PortalUUIDUtil.generate();
+
+		rack.setUuid(uuid);
+
+		rack.setCompanyId(companyProvider.getCompanyId());
+
+		return rack;
+	}
+
+	/**
+	 * Removes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param rackId the primary key of the rack
+	 * @return the rack that was removed
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack remove(long rackId) throws NoSuchRackException {
+		return remove((Serializable)rackId);
+	}
+
+	/**
+	 * Removes the rack with the primary key from the database. Also notifies the appropriate model listeners.
+	 *
+	 * @param primaryKey the primary key of the rack
+	 * @return the rack that was removed
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack remove(Serializable primaryKey) throws NoSuchRackException {
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Rack rack = (Rack)session.get(RackImpl.class, primaryKey);
+
+			if (rack == null) {
+				if (_log.isDebugEnabled()) {
+					_log.debug(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
+				}
+
+				throw new NoSuchRackException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
+					primaryKey);
+			}
+
+			return remove(rack);
+		}
+		catch (NoSuchRackException nsee) {
+			throw nsee;
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+	}
+
+	@Override
+	protected Rack removeImpl(Rack rack) {
+		rack = toUnwrappedModel(rack);
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			if (!session.contains(rack)) {
+				rack = (Rack)session.get(RackImpl.class, rack.getPrimaryKeyObj());
+			}
+
+			if (rack != null) {
+				session.delete(rack);
+			}
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+
+		if (rack != null) {
+			clearCache(rack);
+		}
+
+		return rack;
+	}
+
+	@Override
+	public Rack updateImpl(Rack rack) {
+		rack = toUnwrappedModel(rack);
+
+		boolean isNew = rack.isNew();
+
+		RackModelImpl rackModelImpl = (RackModelImpl)rack;
+
+		if (Validator.isNull(rack.getUuid())) {
+			String uuid = PortalUUIDUtil.generate();
+
+			rack.setUuid(uuid);
+		}
+
+		ServiceContext serviceContext = ServiceContextThreadLocal.getServiceContext();
+
+		Date now = new Date();
+
+		if (isNew && (rack.getCreateDate() == null)) {
+			if (serviceContext == null) {
+				rack.setCreateDate(now);
+			}
+			else {
+				rack.setCreateDate(serviceContext.getCreateDate(now));
+			}
+		}
+
+		if (!rackModelImpl.hasSetModifiedDate()) {
+			if (serviceContext == null) {
+				rack.setModifiedDate(now);
+			}
+			else {
+				rack.setModifiedDate(serviceContext.getModifiedDate(now));
+			}
+		}
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			if (rack.isNew()) {
+				session.save(rack);
+
+				rack.setNew(false);
+			}
+			else {
+				rack = (Rack)session.merge(rack);
+			}
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+
+		finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+
+		if (isNew || !RackModelImpl.COLUMN_BITMASK_ENABLED) {
+			finderCache.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+		}
+
+		else {
+			if ((rackModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] { rackModelImpl.getOriginalUuid() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
+					args);
+
+				args = new Object[] { rackModelImpl.getUuid() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
+					args);
+			}
+
+			if ((rackModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] {
+						rackModelImpl.getOriginalUuid(),
+						rackModelImpl.getOriginalCompanyId()
+					};
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_C, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C,
+					args);
+
+				args = new Object[] {
+						rackModelImpl.getUuid(), rackModelImpl.getCompanyId()
+					};
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_UUID_C, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID_C,
+					args);
+			}
+
+			if ((rackModelImpl.getColumnBitmask() &
+					FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME.getColumnBitmask()) != 0) {
+				Object[] args = new Object[] { rackModelImpl.getOriginalName() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_NAME, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME,
+					args);
+
+				args = new Object[] { rackModelImpl.getName() };
+
+				finderCache.removeResult(FINDER_PATH_COUNT_BY_NAME, args);
+				finderCache.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_NAME,
+					args);
+			}
+		}
+
+		entityCache.putResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+			RackImpl.class, rack.getPrimaryKey(), rack, false);
+
+		clearUniqueFindersCache(rackModelImpl, false);
+		cacheUniqueFindersCache(rackModelImpl);
+
+		rack.resetOriginalValues();
+
+		return rack;
+	}
+
+	protected Rack toUnwrappedModel(Rack rack) {
+		if (rack instanceof RackImpl) {
+			return rack;
+		}
+
+		RackImpl rackImpl = new RackImpl();
+
+		rackImpl.setNew(rack.isNew());
+		rackImpl.setPrimaryKey(rack.getPrimaryKey());
+
+		rackImpl.setUuid(rack.getUuid());
+		rackImpl.setRackId(rack.getRackId());
+		rackImpl.setGroupId(rack.getGroupId());
+		rackImpl.setCompanyId(rack.getCompanyId());
+		rackImpl.setUserId(rack.getUserId());
+		rackImpl.setUserName(rack.getUserName());
+		rackImpl.setCreateDate(rack.getCreateDate());
+		rackImpl.setModifiedDate(rack.getModifiedDate());
+		rackImpl.setType(rack.getType());
+		rackImpl.setName(rack.getName());
+		rackImpl.setNbColumns(rack.getNbColumns());
+		rackImpl.setNbRows(rack.getNbRows());
+		rackImpl.setImage(rack.getImage());
+		rackImpl.setBottlesId(rack.getBottlesId());
+
+		return rackImpl;
+	}
+
+	/**
+	 * Returns the rack with the primary key or throws a {@link com.liferay.portal.kernel.exception.NoSuchModelException} if it could not be found.
+	 *
+	 * @param primaryKey the primary key of the rack
+	 * @return the rack
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack findByPrimaryKey(Serializable primaryKey)
+		throws NoSuchRackException {
+		Rack rack = fetchByPrimaryKey(primaryKey);
+
+		if (rack == null) {
+			if (_log.isDebugEnabled()) {
+				_log.debug(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
+			}
+
+			throw new NoSuchRackException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
+				primaryKey);
+		}
+
+		return rack;
+	}
+
+	/**
+	 * Returns the rack with the primary key or throws a {@link NoSuchRackException} if it could not be found.
+	 *
+	 * @param rackId the primary key of the rack
+	 * @return the rack
+	 * @throws NoSuchRackException if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack findByPrimaryKey(long rackId) throws NoSuchRackException {
+		return findByPrimaryKey((Serializable)rackId);
+	}
+
+	/**
+	 * Returns the rack with the primary key or returns <code>null</code> if it could not be found.
+	 *
+	 * @param primaryKey the primary key of the rack
+	 * @return the rack, or <code>null</code> if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack fetchByPrimaryKey(Serializable primaryKey) {
+		Serializable serializable = entityCache.getResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+				RackImpl.class, primaryKey);
+
+		if (serializable == nullModel) {
+			return null;
+		}
+
+		Rack rack = (Rack)serializable;
+
+		if (rack == null) {
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				rack = (Rack)session.get(RackImpl.class, primaryKey);
+
+				if (rack != null) {
+					cacheResult(rack);
+				}
+				else {
+					entityCache.putResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+						RackImpl.class, primaryKey, nullModel);
+				}
+			}
+			catch (Exception e) {
+				entityCache.removeResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+					RackImpl.class, primaryKey);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return rack;
+	}
+
+	/**
+	 * Returns the rack with the primary key or returns <code>null</code> if it could not be found.
+	 *
+	 * @param rackId the primary key of the rack
+	 * @return the rack, or <code>null</code> if a rack with the primary key could not be found
+	 */
+	@Override
+	public Rack fetchByPrimaryKey(long rackId) {
+		return fetchByPrimaryKey((Serializable)rackId);
+	}
+
+	@Override
+	public Map<Serializable, Rack> fetchByPrimaryKeys(
+		Set<Serializable> primaryKeys) {
+		if (primaryKeys.isEmpty()) {
+			return Collections.emptyMap();
+		}
+
+		Map<Serializable, Rack> map = new HashMap<Serializable, Rack>();
+
+		if (primaryKeys.size() == 1) {
+			Iterator<Serializable> iterator = primaryKeys.iterator();
+
+			Serializable primaryKey = iterator.next();
+
+			Rack rack = fetchByPrimaryKey(primaryKey);
+
+			if (rack != null) {
+				map.put(primaryKey, rack);
+			}
+
+			return map;
+		}
+
+		Set<Serializable> uncachedPrimaryKeys = null;
+
+		for (Serializable primaryKey : primaryKeys) {
+			Serializable serializable = entityCache.getResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+					RackImpl.class, primaryKey);
+
+			if (serializable != nullModel) {
+				if (serializable == null) {
+					if (uncachedPrimaryKeys == null) {
+						uncachedPrimaryKeys = new HashSet<Serializable>();
+					}
+
+					uncachedPrimaryKeys.add(primaryKey);
+				}
+				else {
+					map.put(primaryKey, (Rack)serializable);
+				}
+			}
+		}
+
+		if (uncachedPrimaryKeys == null) {
+			return map;
+		}
+
+		StringBundler query = new StringBundler((uncachedPrimaryKeys.size() * 2) +
+				1);
+
+		query.append(_SQL_SELECT_RACK_WHERE_PKS_IN);
+
+		for (Serializable primaryKey : uncachedPrimaryKeys) {
+			query.append(String.valueOf(primaryKey));
+
+			query.append(StringPool.COMMA);
+		}
+
+		query.setIndex(query.index() - 1);
+
+		query.append(StringPool.CLOSE_PARENTHESIS);
+
+		String sql = query.toString();
+
+		Session session = null;
+
+		try {
+			session = openSession();
+
+			Query q = session.createQuery(sql);
+
+			for (Rack rack : (List<Rack>)q.list()) {
+				map.put(rack.getPrimaryKeyObj(), rack);
+
+				cacheResult(rack);
+
+				uncachedPrimaryKeys.remove(rack.getPrimaryKeyObj());
+			}
+
+			for (Serializable primaryKey : uncachedPrimaryKeys) {
+				entityCache.putResult(RackModelImpl.ENTITY_CACHE_ENABLED,
+					RackImpl.class, primaryKey, nullModel);
+			}
+		}
+		catch (Exception e) {
+			throw processException(e);
+		}
+		finally {
+			closeSession(session);
+		}
+
+		return map;
+	}
+
+	/**
+	 * Returns all the racks.
+	 *
+	 * @return the racks
+	 */
+	@Override
+	public List<Rack> findAll() {
+		return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
+	}
+
+	/**
+	 * Returns a range of all the racks.
+	 *
+	 * <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @return the range of racks
+	 */
+	@Override
+	public List<Rack> findAll(int start, int end) {
+		return findAll(start, end, null);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks.
+	 *
+	 * <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @return the ordered range of racks
+	 */
+	@Override
+	public List<Rack> findAll(int start, int end,
+		OrderByComparator<Rack> orderByComparator) {
+		return findAll(start, end, orderByComparator, true);
+	}
+
+	/**
+	 * Returns an ordered range of all the racks.
+	 *
+	 * <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 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 QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link RackModelImpl}. 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 racks
+	 * @param end the upper bound of the range of racks (not inclusive)
+	 * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
+	 * @param retrieveFromCache whether to retrieve from the finder cache
+	 * @return the ordered range of racks
+	 */
+	@Override
+	public List<Rack> findAll(int start, int end,
+		OrderByComparator<Rack> orderByComparator, boolean retrieveFromCache) {
+		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<Rack> list = null;
+
+		if (retrieveFromCache) {
+			list = (List<Rack>)finderCache.getResult(finderPath, finderArgs,
+					this);
+		}
+
+		if (list == null) {
+			StringBundler query = null;
+			String sql = null;
+
+			if (orderByComparator != null) {
+				query = new StringBundler(2 +
+						(orderByComparator.getOrderByFields().length * 2));
+
+				query.append(_SQL_SELECT_RACK);
+
+				appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
+					orderByComparator);
+
+				sql = query.toString();
+			}
+			else {
+				sql = _SQL_SELECT_RACK;
+
+				if (pagination) {
+					sql = sql.concat(RackModelImpl.ORDER_BY_JPQL);
+				}
+			}
+
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(sql);
+
+				if (!pagination) {
+					list = (List<Rack>)QueryUtil.list(q, getDialect(), start,
+							end, false);
+
+					Collections.sort(list);
+
+					list = Collections.unmodifiableList(list);
+				}
+				else {
+					list = (List<Rack>)QueryUtil.list(q, getDialect(), start,
+							end);
+				}
+
+				cacheResult(list);
+
+				finderCache.putResult(finderPath, finderArgs, list);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(finderPath, finderArgs);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * Removes all the racks from the database.
+	 *
+	 */
+	@Override
+	public void removeAll() {
+		for (Rack rack : findAll()) {
+			remove(rack);
+		}
+	}
+
+	/**
+	 * Returns the number of racks.
+	 *
+	 * @return the number of racks
+	 */
+	@Override
+	public int countAll() {
+		Long count = (Long)finderCache.getResult(FINDER_PATH_COUNT_ALL,
+				FINDER_ARGS_EMPTY, this);
+
+		if (count == null) {
+			Session session = null;
+
+			try {
+				session = openSession();
+
+				Query q = session.createQuery(_SQL_COUNT_RACK);
+
+				count = (Long)q.uniqueResult();
+
+				finderCache.putResult(FINDER_PATH_COUNT_ALL, FINDER_ARGS_EMPTY,
+					count);
+			}
+			catch (Exception e) {
+				finderCache.removeResult(FINDER_PATH_COUNT_ALL,
+					FINDER_ARGS_EMPTY);
+
+				throw processException(e);
+			}
+			finally {
+				closeSession(session);
+			}
+		}
+
+		return count.intValue();
+	}
+
+	@Override
+	public Set<String> getBadColumnNames() {
+		return _badColumnNames;
+	}
+
+	@Override
+	protected Map<String, Integer> getTableColumnsMap() {
+		return RackModelImpl.TABLE_COLUMNS_MAP;
+	}
+
+	/**
+	 * Initializes the rack persistence.
+	 */
+	public void afterPropertiesSet() {
+	}
+
+	public void destroy() {
+		entityCache.removeCache(RackImpl.class.getName());
+		finderCache.removeCache(FINDER_CLASS_NAME_ENTITY);
+		finderCache.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
+		finderCache.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
+	}
+
+	@ServiceReference(type = CompanyProviderWrapper.class)
+	protected CompanyProvider companyProvider;
+	@ServiceReference(type = EntityCache.class)
+	protected EntityCache entityCache;
+	@ServiceReference(type = FinderCache.class)
+	protected FinderCache finderCache;
+	private static final String _SQL_SELECT_RACK = "SELECT rack FROM Rack rack";
+	private static final String _SQL_SELECT_RACK_WHERE_PKS_IN = "SELECT rack FROM Rack rack WHERE rackId IN (";
+	private static final String _SQL_SELECT_RACK_WHERE = "SELECT rack FROM Rack rack WHERE ";
+	private static final String _SQL_COUNT_RACK = "SELECT COUNT(rack) FROM Rack rack";
+	private static final String _SQL_COUNT_RACK_WHERE = "SELECT COUNT(rack) FROM Rack rack WHERE ";
+	private static final String _ORDER_BY_ENTITY_ALIAS = "rack.";
+	private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No Rack exists with the primary key ";
+	private static final String _NO_SUCH_ENTITY_WITH_KEY = "No Rack exists with the key {";
+	private static final Log _log = LogFactoryUtil.getLog(RackPersistenceImpl.class);
+	private static final Set<String> _badColumnNames = SetUtil.fromArray(new String[] {
+				"uuid", "type"
+			});
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/util/ServiceProps.java b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/util/ServiceProps.java
new file mode 100644
index 0000000000000000000000000000000000000000..64ebeca6c684c15b5fc09df0a988ac360f92a7fc
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/java/fr/ippon/services/embercellar/service/util/ServiceProps.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2000-present 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 fr.ippon.services.embercellar.service.util;
+
+import aQute.bnd.annotation.ProviderType;
+
+import com.liferay.portal.kernel.configuration.Configuration;
+import com.liferay.portal.kernel.configuration.ConfigurationFactoryUtil;
+import com.liferay.portal.kernel.configuration.Filter;
+
+import java.util.Properties;
+
+/**
+ * @author Brian Wing Shun Chan
+ * @generated
+ */
+@ProviderType
+public class ServiceProps {
+	public static void addProperties(Properties properties) {
+		_instance._configuration.addProperties(properties);
+	}
+
+	public static boolean contains(String key) {
+		return _instance._configuration.contains(key);
+	}
+
+	public static String get(String key) {
+		return _instance._configuration.get(key);
+	}
+
+	public static String get(String key, Filter filter) {
+		return _instance._configuration.get(key, filter);
+	}
+
+	public static String[] getArray(String key) {
+		return _instance._configuration.getArray(key);
+	}
+
+	public static String[] getArray(String key, Filter filter) {
+		return _instance._configuration.getArray(key, filter);
+	}
+
+	public static Properties getProperties() {
+		return _instance._configuration.getProperties();
+	}
+
+	public static void removeProperties(Properties properties) {
+		_instance._configuration.removeProperties(properties);
+	}
+
+	public static void set(String key, String value) {
+		_instance._configuration.set(key, value);
+	}
+
+	private ServiceProps() {
+		_configuration = ConfigurationFactoryUtil.getConfiguration(getClass()
+																	   .getClassLoader(),
+				"service");
+	}
+
+	private static ServiceProps _instance = new ServiceProps();
+	private Configuration _configuration;
+}
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/module-hbm.xml b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/module-hbm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d95964264e12d3d16c36fe58aea22d204e105500
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/module-hbm.xml
@@ -0,0 +1,43 @@
+<?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 auto-import="false" default-lazy="false">
+	<import class="fr.ippon.services.embercellar.model.Bottle" />
+	<import class="fr.ippon.services.embercellar.model.Rack" />
+	<class name="fr.ippon.services.embercellar.model.impl.BottleImpl" table="embercellar_Bottle">
+		<id name="bottleId" type="long">
+			<generator class="assigned" />
+		</id>
+		<property column="uuid_" name="uuid" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="groupId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
+		<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="name" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="flipped" type="com.liferay.portal.dao.orm.hibernate.BooleanType" />
+		<property name="xcolumn" type="com.liferay.portal.dao.orm.hibernate.IntegerType" />
+		<property name="yrow" type="com.liferay.portal.dao.orm.hibernate.IntegerType" />
+		<property column="type_" name="type" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="rackId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
+	</class>
+	<class name="fr.ippon.services.embercellar.model.impl.RackImpl" table="embercellar_Rack">
+		<id name="rackId" type="long">
+			<generator class="assigned" />
+		</id>
+		<property column="uuid_" name="uuid" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="groupId" type="com.liferay.portal.dao.orm.hibernate.LongType" />
+		<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 column="type_" name="type" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="name" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="nbColumns" type="com.liferay.portal.dao.orm.hibernate.IntegerType" />
+		<property name="nbRows" type="com.liferay.portal.dao.orm.hibernate.IntegerType" />
+		<property name="image" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+		<property name="bottlesId" type="com.liferay.portal.dao.orm.hibernate.StringType" />
+	</class>
+</hibernate-mapping>
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/portlet-model-hints.xml b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/portlet-model-hints.xml
new file mode 100644
index 0000000000000000000000000000000000000000..65d0de8b207adb3d952a2959e6b77f8871acd3da
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/portlet-model-hints.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+
+<model-hints>
+	<model name="fr.ippon.services.embercellar.model.Bottle">
+		<field name="uuid" type="String" />
+		<field name="bottleId" type="long" />
+		<field name="groupId" 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="name" type="String" />
+		<field name="flipped" type="boolean" />
+		<field name="xcolumn" type="int" />
+		<field name="yrow" type="int" />
+		<field name="type" type="String" />
+		<field name="rackId" type="long" />
+	</model>
+	<model name="fr.ippon.services.embercellar.model.Rack">
+		<field name="uuid" type="String" />
+		<field name="rackId" type="long" />
+		<field name="groupId" 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="type" type="String" />
+		<field name="name" type="String" />
+		<field name="nbColumns" type="int" />
+		<field name="nbRows" type="int" />
+		<field name="image" type="String" />
+		<field name="bottlesId" type="String" />
+	</model>
+</model-hints>
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/spring/module-spring.xml b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/spring/module-spring.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5debef2f7b71a77fd7e3ffdaf27b66312a877d4d
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/spring/module-spring.xml
@@ -0,0 +1,10 @@
+<?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.xsd">
+	<bean class="fr.ippon.services.embercellar.service.impl.BottleLocalServiceImpl" id="fr.ippon.services.embercellar.service.BottleLocalService" />
+	<bean class="fr.ippon.services.embercellar.service.impl.BottleServiceImpl" id="fr.ippon.services.embercellar.service.BottleService" />
+	<bean class="fr.ippon.services.embercellar.service.persistence.impl.BottlePersistenceImpl" id="fr.ippon.services.embercellar.service.persistence.BottlePersistence" parent="basePersistence" />
+	<bean class="fr.ippon.services.embercellar.service.impl.RackLocalServiceImpl" id="fr.ippon.services.embercellar.service.RackLocalService" />
+	<bean class="fr.ippon.services.embercellar.service.impl.RackServiceImpl" id="fr.ippon.services.embercellar.service.RackService" />
+	<bean class="fr.ippon.services.embercellar.service.persistence.impl.RackPersistenceImpl" id="fr.ippon.services.embercellar.service.persistence.RackPersistence" parent="basePersistence" />
+</beans>
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/indexes.sql b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/indexes.sql
new file mode 100644
index 0000000000000000000000000000000000000000..8cb8a2ce3ec7e00d4bca1c8e9a4dcb79094ad1c5
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/indexes.sql
@@ -0,0 +1,8 @@
+create index IX_21A87F10 on embercellar_Bottle (name[$COLUMN_LENGTH:75$]);
+create index IX_E85CF057 on embercellar_Bottle (rackId);
+create index IX_1E2F3FC5 on embercellar_Bottle (uuid_[$COLUMN_LENGTH:75$], companyId);
+create unique index IX_C39EF387 on embercellar_Bottle (uuid_[$COLUMN_LENGTH:75$], groupId);
+
+create index IX_6070DC61 on embercellar_Rack (name[$COLUMN_LENGTH:75$]);
+create index IX_81C92B96 on embercellar_Rack (uuid_[$COLUMN_LENGTH:75$], companyId);
+create unique index IX_59B39F98 on embercellar_Rack (uuid_[$COLUMN_LENGTH:75$], groupId);
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/sequences.sql b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/sequences.sql
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/tables.sql b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/tables.sql
new file mode 100644
index 0000000000000000000000000000000000000000..60bc531d06bbf5adcfdff0efe023c43ac843d2a3
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/META-INF/sql/tables.sql
@@ -0,0 +1,33 @@
+create table embercellar_Bottle (
+	uuid_ VARCHAR(75) null,
+	bottleId LONG not null primary key,
+	groupId LONG,
+	companyId LONG,
+	userId LONG,
+	userName VARCHAR(75) null,
+	createDate DATE null,
+	modifiedDate DATE null,
+	name VARCHAR(75) null,
+	flipped BOOLEAN,
+	xcolumn INTEGER,
+	yrow INTEGER,
+	type_ VARCHAR(75) null,
+	rackId LONG
+);
+
+create table embercellar_Rack (
+	uuid_ VARCHAR(75) null,
+	rackId LONG not null primary key,
+	groupId LONG,
+	companyId LONG,
+	userId LONG,
+	userName VARCHAR(75) null,
+	createDate DATE null,
+	modifiedDate DATE null,
+	type_ VARCHAR(75) null,
+	name VARCHAR(75) null,
+	nbColumns INTEGER,
+	nbRows INTEGER,
+	image VARCHAR(75) null,
+	bottlesId VARCHAR(75) null
+);
\ No newline at end of file
diff --git a/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/service.properties b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/service.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bbd06c6bfa57405d0c92303608f8a9f798286616
--- /dev/null
+++ b/lf7-sdk/modules/embercellar/embercellar-service/src/main/resources/service.properties
@@ -0,0 +1,18 @@
+##
+## 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=embercellar
+    build.number=2
+    build.date=1492609879853
+    build.auto.upgrade=true
\ No newline at end of file
diff --git a/lf7-sdk/settings.gradle b/lf7-sdk/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..a342dcac040b190419537345cd3bb6830c3a0ef6
--- /dev/null
+++ b/lf7-sdk/settings.gradle
@@ -0,0 +1,13 @@
+buildscript {
+	dependencies {
+		classpath group: "com.liferay", name: "com.liferay.gradle.plugins.workspace", version: "1.2.4"
+	}
+
+	repositories {
+		maven {
+			url "https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public"
+		}
+	}
+}
+
+apply plugin: "com.liferay.workspace"
\ No newline at end of file