diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index fed41b0..0f8f146 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -796,6 +796,7 @@
         pw.println("mNoDataDueToRoaming=" + mNoDataDueToRoaming);
         pw.println("mDefaultDataSubId=" + mDefaultDataSubId);
         pw.println("mDataRoamingNotifLog:");
+        pw.println("isSmsCapable=" + TelephonyManager.from(this).isSmsCapable());
         pw.increaseIndent();
         mDataRoamingNotifLog.dump(fd, pw, args);
         pw.decreaseIndent();
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index ed1de19..d0ed9bd 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -7090,4 +7090,36 @@
             Binder.restoreCallingIdentity(identity);
         }
     }
+
+    @Override
+    public boolean setDataAllowedDuringVoiceCall(int subId, boolean allow) {
+        enforceModifyPermission();
+
+        // Now that all security checks passes, perform the operation as ourselves.
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            Phone phone = getPhone(subId);
+            if (phone == null) return false;
+
+            return phone.getDataEnabledSettings().setAllowDataDuringVoiceCall(allow);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public boolean isDataAllowedInVoiceCall(int subId) {
+        enforceReadPrivilegedPermission("isDataAllowedInVoiceCall");
+
+        // Now that all security checks passes, perform the operation as ourselves.
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            Phone phone = getPhone(subId);
+            if (phone == null) return false;
+
+            return phone.getDataEnabledSettings().isDataAllowedInVoiceCall();
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
 }
diff --git a/src/com/android/services/telephony/ConferenceParticipantConnection.java b/src/com/android/services/telephony/ConferenceParticipantConnection.java
index 1f330f9..651ace5 100644
--- a/src/com/android/services/telephony/ConferenceParticipantConnection.java
+++ b/src/com/android/services/telephony/ConferenceParticipantConnection.java
@@ -53,10 +53,13 @@
      * Creates a new instance.
      *
      * @param participant The conference participant to create the instance for.
+     * @param isRemotelyHosted {@code true} if this participant is part of a conference remotely
+     *                         hosted on another device, {@code false} otherwise.
      */
     public ConferenceParticipantConnection(
             com.android.internal.telephony.Connection parentConnection,
-            ConferenceParticipant participant) {
+            ConferenceParticipant participant,
+            boolean isRemotelyHosted) {
 
         mParentConnection = parentConnection;
 
@@ -75,7 +78,7 @@
         mUserEntity = participant.getHandle();
         mEndpoint = participant.getEndpoint();
 
-        setCapabilities();
+        setCapabilitiesAndProperties(isRemotelyHosted);
     }
 
     /**
@@ -147,13 +150,19 @@
     }
 
     /**
-     * Configures the capabilities applicable to this connection.  A
+     * Configures the capabilities and properties applicable to this connection.  A
      * conference participant can only be disconnected from a conference since there is not
      * actual connection to the participant which could be split from the conference.
+     * @param isRemotelyHosted {@code true} if this participant is part of a conference hosted
+     *                         hosted on a remote device, {@code false} otherwise.
      */
-    private void setCapabilities() {
+    private void setCapabilitiesAndProperties(boolean isRemotelyHosted) {
         int capabilities = CAPABILITY_DISCONNECT_FROM_CONFERENCE;
         setConnectionCapabilities(capabilities);
+
+        if (isRemotelyHosted) {
+            setConnectionProperties(PROPERTY_REMOTELY_HOSTED);
+        }
     }
 
 
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index 8cd8051..9b66487 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -395,6 +395,9 @@
                 Connection.PROPERTY_IS_EXTERNAL_CALL,
                 can(properties, Connection.PROPERTY_IS_EXTERNAL_CALL));
 
+        conferenceProperties = changeBitmask(conferenceProperties,
+                Connection.PROPERTY_REMOTELY_HOSTED, !isConferenceHost());
+
         return conferenceProperties;
     }
 
@@ -683,6 +686,16 @@
                     mConferenceHostPhoneAccountHandle);
         }
 
+        // If the conference is not hosted on this device copy over the address and presentation and
+        // connect times so that we can log this appropriately in the call log.
+        if (!isConferenceHost()) {
+            setAddress(mConferenceHost.getAddress(), mConferenceHost.getAddressPresentation());
+            setCallerDisplayName(mConferenceHost.getCallerDisplayName(),
+                    mConferenceHost.getCallerDisplayNamePresentation());
+            setConnectionStartElapsedRealTime(mConferenceHost.getConnectElapsedTimeMillis());
+            setConnectionTime(mConferenceHost.getConnectTimeMillis());
+        }
+
         mConferenceHost.addConnectionListener(mConferenceHostListener);
         mConferenceHost.addTelephonyConnectionListener(mTelephonyConnectionListener);
         setConnectionCapabilities(applyHostCapabilities(getConnectionCapabilities(),
@@ -952,7 +965,8 @@
         // Create and add the new connection in holding state so that it does not become the
         // active call.
         ConferenceParticipantConnection connection = new ConferenceParticipantConnection(
-                parent.getOriginalConnection(), participant);
+                parent.getOriginalConnection(), participant,
+                !isConferenceHost() /* isRemotelyHosted */);
         connection.addConnectionListener(mParticipantListener);
         if (participant.getConnectTime() == 0) {
             connection.setConnectTimeMillis(parent.getConnectTimeMillis());
