diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterGateway.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterGateway.java
new file mode 100644
index 0000000..9a75556
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterGateway.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtnrsc;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+import java.util.Objects;
+
+/**
+ * Representation of a Router gateway.
+ */
+public final class RouterGateway {
+
+    private final TenantNetworkId networkId;
+    private final boolean enableSnat;
+    private final Collection<FixedIp> externalFixedIps;
+
+    // Public construction is prohibited
+    private RouterGateway(TenantNetworkId networkId, boolean enableSnat,
+                         Collection<FixedIp> externalFixedIps) {
+        this.networkId = checkNotNull(networkId, "networkId cannot be null");
+        this.enableSnat = checkNotNull(enableSnat, "enableSnat cannot be null");
+        this.externalFixedIps = checkNotNull(externalFixedIps, "externalFixedIps cannot be null");
+    }
+
+    /**
+     * Creates router gateway object.
+     *
+     * @param networkId network identifier
+     * @param enableSnat SNAT enable or not
+     * @param externalFixedIps external fixed IP
+     * @return RouterGateway
+     */
+    public static RouterGateway routerGateway(TenantNetworkId networkId, boolean enableSnat,
+                                              Collection<FixedIp> externalFixedIps) {
+        return new RouterGateway(networkId, enableSnat, externalFixedIps);
+    }
+
+    /**
+     * Returns network identifier.
+     *
+     * @return networkId
+     */
+    public TenantNetworkId networkId() {
+        return networkId;
+    }
+
+    /**
+     * Return SNAT enable or not.
+     *
+     * @return enableSnat
+     */
+    public boolean enableSnat() {
+        return enableSnat;
+    }
+
+    /**
+     * Return external fixed Ip.
+     *
+     * @return externalFixedIps
+     */
+    public Collection<FixedIp> externalFixedIps() {
+        return externalFixedIps;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(networkId, enableSnat, externalFixedIps);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof RouterGateway) {
+            final RouterGateway that = (RouterGateway) obj;
+            return Objects.equals(this.networkId, that.networkId)
+                    && Objects.equals(this.enableSnat, that.enableSnat)
+                    && Objects.equals(this.externalFixedIps, that.externalFixedIps);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("networkId", networkId)
+                .add("enableSnat", enableSnat)
+                .add("externalFixedIps", externalFixedIps)
+                .toString();
+    }
+}
diff --git a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/router/RouterGatewayTest.java b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/router/RouterGatewayTest.java
new file mode 100644
index 0000000..ce6b6c0
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/router/RouterGatewayTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtnrsc.router;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.onosproject.vtnrsc.RouterGateway;
+import org.onosproject.vtnrsc.TenantNetworkId;
+import org.onosproject.vtnrsc.FixedIp;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Unit tests for RouterGateway class.
+ */
+public class RouterGatewayTest {
+    final TenantNetworkId networkId1 = TenantNetworkId.networkId("1");
+    final TenantNetworkId networkId2 = TenantNetworkId.networkId("2");
+    final Set<FixedIp> fixedIpSet1 = new HashSet<>();
+    final Set<FixedIp> fixedIpSet2 = new HashSet<>();
+
+    /**
+     * Checks that the RouterGateway class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(RouterGateway.class);
+    }
+
+    /**
+     * Checks the operation of equals().
+     */
+    @Test
+    public void testEquals() {
+        RouterGateway routerGateway1 = RouterGateway.routerGateway(networkId1,
+                                                                   true,
+                                                                   fixedIpSet1);
+        RouterGateway routerGateway2 = RouterGateway.routerGateway(networkId1,
+                                                                   true,
+                                                                   fixedIpSet1);
+        RouterGateway routerGateway3 = RouterGateway.routerGateway(networkId2,
+                                                                   true,
+                                                                   fixedIpSet2);
+        new EqualsTester().addEqualityGroup(routerGateway1, routerGateway2)
+                .addEqualityGroup(routerGateway3).testEquals();
+    }
+
+    /**
+     * Checks the construction of a RouterGateway object.
+     */
+    @Test
+    public void testConstruction() {
+        RouterGateway routerGateway = RouterGateway.routerGateway(networkId1,
+                                                                  true,
+                                                                  fixedIpSet1);
+        assertThat(fixedIpSet1, is(notNullValue()));
+        assertThat(fixedIpSet1, is(routerGateway.externalFixedIps()));
+        assertThat(networkId1, is(notNullValue()));
+        assertThat(networkId1, is(routerGateway.networkId()));
+        assertThat(routerGateway.enableSnat(), is(true));
+    }
+}
