diff --git a/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java b/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java
new file mode 100755
index 0000000..6dec71f
--- /dev/null
+++ b/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.gluon.rsc.cli;
+
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.gluon.rsc.GluonServer;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.onosproject.gluon.manager.GluonManager.createServer;
+import static org.onosproject.gluon.rsc.GluonConstants.GLUON_DEFAULT_PORT;
+import static org.onosproject.gluon.rsc.GluonConstants.GLUON_HTTP;
+import static org.onosproject.gluon.rsc.GluonConstants.INVALID_MODE;
+import static org.onosproject.gluon.rsc.GluonConstants.INVALID_RANGE;
+import static org.onosproject.gluon.rsc.GluonConstants.KEY_TYPE;
+import static org.onosproject.gluon.rsc.GluonConstants.MODE_START;
+import static org.onosproject.gluon.rsc.GluonConstants.MODE_STOP;
+import static org.onosproject.gluon.rsc.GluonConstants.NO_SERVER_AVAIL;
+import static org.onosproject.gluon.rsc.GluonConstants.NO_SERVER_AVAIL_ON_PORT;
+import static org.onosproject.gluon.rsc.GluonConstants.PROTON_KEY_SUPPORT;
+import static org.onosproject.gluon.rsc.GluonConstants.WRONG_INPUT;
+import static org.onosproject.gluon.rsc.GluonConstants.WRONG_INPUT_TYPE;
+import static org.onosproject.gluon.rsc.GluonConstants.WRONG_IP_FORMAT;
+
+
+/**
+ * To monitor Gluon etcd server.
+ */
+@Command(scope = "onos", name = "gluon",
+        description = "Support for reading Gluon data via etcd client")
+public class GluonServerCommand extends AbstractShellCommand {
+
+    @Option(name = "-m", aliases = "--mode",
+            description = "Gluon server monitoring mode: start; stop",
+            required = false, multiValued = false)
+    String mode = MODE_START;
+
+    @Option(name = "-i", aliases = "--server-ip",
+            description = "Gluon server ip address",
+            required = true, multiValued = false)
+    String ipAddress = null;
+
+    @Option(name = "-p", aliases = "--port", description = "Gluon server port",
+            required = false, multiValued = false)
+    String port = GLUON_DEFAULT_PORT;
+
+    @Option(name = "-k", aliases = "--key",
+            description = "Proton key : net-l3vpn",
+            required = false, multiValued = false)
+    String protonKey = KEY_TYPE;
+
+    public String version = null;
+
+    @Override
+    public void execute() {
+        try {
+            if (ipAddress != null && isValidIP(ipAddress) && isValidPort(port)
+                    && isValidMode(mode) && isValidProtonKey(protonKey)
+                    && isSeverReachable()) {
+                String url = GLUON_HTTP + ipAddress + ":" + port;
+                if (isEtcdSeverAvailable()) {
+                    //Gets gluon server running version
+                    version = gluonServerVersion();
+                    createServer(url, protonKey, mode, version);
+                } else {
+                    log.info(NO_SERVER_AVAIL_ON_PORT);
+                    return;
+                }
+            } else {
+                log.info(WRONG_INPUT);
+            }
+        } catch (Exception e) {
+            print(null, e.getMessage());
+        }
+    }
+
+    /**
+     * Returns boolean if given IP format is valid.
+     *
+     * @param ipAddr Ip Address
+     * @return boolean
+     */
+    public boolean isValidIP(String ipAddr) {
+        boolean isIPaddrValid;
+        Pattern pattern = Pattern.compile("^(\\d{1,3})\\" +
+                                                  ".(\\d{1,3})\\" +
+                                                  ".(\\d{1,3})\\.(\\d{1,3})$");
+        Matcher matcher = pattern.matcher(ipAddr);
+        if (matcher.find()) {
+            isIPaddrValid = true;
+        } else {
+            print(WRONG_IP_FORMAT);
+            isIPaddrValid = false;
+        }
+        return isIPaddrValid;
+    }
+
+    /**
+     * Returns boolean if given port value is valid.
+     *
+     * @param portValue port number
+     * @return boolean
+     */
+    public boolean isValidPort(String portValue) {
+        boolean isPortValid = false;
+        try {
+            Integer portNum = Integer.parseInt(portValue);
+            if (portNum >= 0 && portNum <= 65535) {
+                isPortValid = true;
+            } else {
+                print(INVALID_RANGE);
+                isPortValid = false;
+            }
+        } catch (NumberFormatException nfe) {
+            print(WRONG_INPUT_TYPE);
+        }
+        return isPortValid;
+    }
+
+    /**
+     * Returns boolean if given mode is valid.
+     *
+     * @param mode server mode
+     * @return boolean
+     */
+    public boolean isValidMode(String mode) {
+        boolean isValidMode;
+        if (mode.equalsIgnoreCase(MODE_START) ||
+                mode.equalsIgnoreCase(MODE_STOP)) {
+            isValidMode = true;
+        } else {
+            print(INVALID_MODE);
+            isValidMode = false;
+        }
+        return isValidMode;
+    }
+
+    /**
+     * Returns boolean if given mode is valid.
+     *
+     * @param key key
+     * @return boolean
+     */
+    public boolean isValidProtonKey(String key) {
+        boolean isValidProtonKey = true;
+        if (!KEY_TYPE.equalsIgnoreCase(key)) {
+            print(PROTON_KEY_SUPPORT);
+            isValidProtonKey = false;
+        }
+        return isValidProtonKey;
+    }
+
+    /**
+     * Returns version of gluon server.
+     *
+     * @return String
+     */
+
+    public String gluonServerVersion() {
+        String serverUrl = GLUON_HTTP + this.ipAddress + ":" +
+                this.port + "/version";
+        GluonServer gluonServer = new GluonServer();
+        String gluonversion = gluonServer.getGluonServerVersion(serverUrl);
+        String[] versionArray = gluonversion.split("\\.");
+        version = versionArray[0];
+        return version;
+    }
+
+    /**
+     * Returns reachability of Gluon server.
+     *
+     * @return isSeverReachable
+     */
+    public boolean isSeverReachable() {
+        boolean isSeverReachable = false;
+        try {
+            InetAddress inet = InetAddress.getByName(ipAddress);
+            if (inet.isReachable(5000)) {
+                isSeverReachable = true;
+            } else {
+                isSeverReachable = false;
+                print(NO_SERVER_AVAIL);
+            }
+        } catch (IOException e) {
+            isSeverReachable = false;
+            log.error("Check server process is failed with {} ",
+                      e.getMessage());
+        }
+        return isSeverReachable;
+    }
+
+    /**
+     * Returns availability of Gluon server.
+     *
+     * @return isServerAvailable
+     */
+    public boolean isEtcdSeverAvailable() {
+        String serverUrl = GLUON_HTTP + ipAddress + ":" + port;
+        boolean isServerAvailable;
+        try {
+            URL url = new URL(serverUrl);
+            URLConnection connection = url.openConnection();
+            connection.connect();
+            isServerAvailable = true;
+        } catch (IOException e) {
+            print(NO_SERVER_AVAIL_ON_PORT);
+            isServerAvailable = false;
+        }
+        return isServerAvailable;
+    }
+}
