diff --git a/apps/mcast/src/main/java/org/onosproject/mcast/McastEvent.java b/apps/mcast/src/main/java/org/onosproject/mcast/McastEvent.java
new file mode 100644
index 0000000..8ca57f2
--- /dev/null
+++ b/apps/mcast/src/main/java/org/onosproject/mcast/McastEvent.java
@@ -0,0 +1,111 @@
+/*
+ * 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.mcast;
+
+import org.onosproject.event.AbstractEvent;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.Optional;
+
+/**
+ * An entity representing a multicast event. Event either add or remove
+ * sinks or sources.
+ */
+public class McastEvent extends AbstractEvent<McastEvent.Type, McastRoute> {
+
+    private final Optional<ConnectPoint> sink;
+    private final Optional<ConnectPoint> source;
+
+    public enum Type {
+        /**
+         * A new mcast route has been added.
+         */
+        ROUTE_ADDED,
+
+        /**
+         * A mcast route has been removed.
+         */
+        ROUTE_REMOVED,
+
+        /**
+         * A source for a mcast route (ie. the subject) has been added.
+         */
+        SOURCE_ADDED,
+
+        /**
+         * A source for a mcast route (ie. the subject) has been removed.
+         */
+        SOURCE_REMOVED,
+
+        /**
+         * A sink for a mcast route (ie. the subject) has been added.
+         */
+        SINK_ADDED,
+
+        /**
+         * A source for a mcast route (ie. the subject) has been removed.
+         */
+        SINK_REMOVED
+    }
+
+    private McastEvent(McastEvent.Type type, McastRoute subject) {
+        super(type, subject);
+        sink = Optional.empty();
+        source = Optional.empty();
+    }
+
+    private McastEvent(McastEvent.Type type, McastRoute subject, long time) {
+        super(type, subject, time);
+        sink = Optional.empty();
+        source = Optional.empty();
+    }
+
+    protected McastEvent(McastEvent.Type type, McastRoute subject,
+                       ConnectPoint sink,
+                       ConnectPoint source) {
+        super(type, subject);
+        this.sink = Optional.ofNullable(sink);
+        this.source = Optional.ofNullable(source);
+    }
+
+    protected McastEvent(McastEvent.Type type, McastRoute subject, long time,
+                       ConnectPoint sink,
+                       ConnectPoint source) {
+        super(type, subject, time);
+        this.sink = Optional.ofNullable(sink);
+        this.source = Optional.ofNullable(source);
+    }
+
+    /**
+     * The sink which has been removed or added. The field may not be set
+     * if the sink has not been detected yet or has been removed.
+     *
+     * @return an optional connect point
+     */
+    public Optional<ConnectPoint> sink() {
+        return sink;
+    }
+
+    /**
+     * The source which has been removed or added. The field may not be set
+     * if the source has not been detected yet or has been removed.
+
+     * @return an optional connect point
+     */
+    public Optional<ConnectPoint> source() {
+        return source;
+    }
+}
diff --git a/apps/mcast/src/main/java/org/onosproject/mcast/McastListener.java b/apps/mcast/src/main/java/org/onosproject/mcast/McastListener.java
new file mode 100644
index 0000000..cbd84af
--- /dev/null
+++ b/apps/mcast/src/main/java/org/onosproject/mcast/McastListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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.mcast;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * A listener interface for multicast events.
+ */
+public interface McastListener extends EventListener<McastEvent> {
+}
diff --git a/apps/mcast/src/main/java/org/onosproject/mcast/McastRoute.java b/apps/mcast/src/main/java/org/onosproject/mcast/McastRoute.java
new file mode 100644
index 0000000..d2999d0
--- /dev/null
+++ b/apps/mcast/src/main/java/org/onosproject/mcast/McastRoute.java
@@ -0,0 +1,52 @@
+/*
+ * 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.mcast;
+
+import org.onlab.packet.IpPrefix;
+
+/**
+ * An entity representing a multicast route consisting of a source
+ * and a multicast group address.
+ */
+public class McastRoute {
+
+    public final IpPrefix source;
+    public final IpPrefix group;
+
+    public McastRoute(IpPrefix source, IpPrefix group) {
+        this.source = source;
+        this.group = group;
+    }
+
+    /**
+     * Fetches the source address of this route.
+     *
+     * @return an ip address
+     */
+    public IpPrefix source() {
+        return source;
+    }
+
+    /**
+     * Fetches the group address of this route.
+     *
+     * @return an ip address
+     */
+    public IpPrefix group() {
+        return group;
+    }
+
+}
diff --git a/apps/mcast/src/main/java/org/onosproject/mcast/MulticastRouteTable.java b/apps/mcast/src/main/java/org/onosproject/mcast/MulticastRouteTable.java
new file mode 100644
index 0000000..8bff021
--- /dev/null
+++ b/apps/mcast/src/main/java/org/onosproject/mcast/MulticastRouteTable.java
@@ -0,0 +1,90 @@
+/*
+ * 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.mcast;
+
+import org.onosproject.net.ConnectPoint;
+
+import java.util.List;
+
+/**
+ * A service interface for maintaining multicast information.
+ */
+public interface MulticastRouteTable {
+
+    /**
+     * Adds a route to the information base.
+     *
+     * @param route a multicast route
+     */
+    void add(McastRoute route);
+
+    /**
+     * Removes a route from the information base.
+     *
+     * @param route a multicast route
+     */
+    void remove(McastRoute route);
+
+    /**
+     * Adds a source connection to the route from where the
+     * data stream is originating.
+     *
+     * @param route the multicast route
+     * @param connectPoint a source connect point
+     */
+    void addSource(McastRoute route, ConnectPoint connectPoint);
+
+    /**
+     * Adds a sink to the route to which a data stream should be
+     * sent to.
+     *
+     * @param route a multicast route
+     * @param connectPoint a sink connect point
+     */
+    void addSink(McastRoute route, ConnectPoint connectPoint);
+
+    /**
+     * Removes a source connection from the route.
+     *
+     * @param route the multicast route
+     * @param connectPoint a source connect point
+     */
+    void removeSource(McastRoute route, ConnectPoint connectPoint);
+
+    /**
+     * Removes a sink from the route.
+     *
+     * @param route the multicast route
+     * @param connectPoint a sink connect point
+     */
+    void removeSink(McastRoute route, ConnectPoint connectPoint);
+
+    /**
+     * Find the data source association for this multicast route.
+     *
+     * @param route a multicast route
+     * @return a connect point
+     */
+    ConnectPoint fetchSource(McastRoute route);
+
+    /**
+     * Find the list of sinks for this route.
+     *
+     * @param route a multicast route
+     * @return a list of connect points
+     */
+    List<ConnectPoint> fetchSinks(McastRoute route);
+}
