diff --git a/src/name-assignments/assignment-param.cpp b/src/name-assignments/assignment-param.cpp
index e32665e..56da436 100644
--- a/src/name-assignments/assignment-param.cpp
+++ b/src/name-assignments/assignment-param.cpp
@@ -7,56 +7,30 @@
 namespace ndn {
 namespace ndncert {
 
-_LOG_INIT(ndncert.assignment.param);
-
 NDNCERT_REGISTER_FUNCFACTORY(AssignmentParam, "param");
 
-AssignmentParam::AssignmentParam()
-    : NameAssignmentFuncFactory("param")
+AssignmentParam::AssignmentParam(const std::string& format)
+  : NameAssignmentFuncFactory("param", format)
+{}
+
+std::vector<PartialName>
+AssignmentParam::assignName(const std::vector<std::tuple<std::string, std::string>>& params)
 {
-}
-
-NameAssignmentFunc
-AssignmentParam::getFunction(const std::string &factoryParam) {
-    std::list<std::string> paramList;
-    size_t index = 0, startIndex = 0;
-    while ((index = factoryParam.find("/", startIndex)) != std::string::npos) {
-        auto component = factoryParam.substr(startIndex, index - startIndex);
-        if (!component.empty()) {
-            paramList.push_back(component);
-        }
-        startIndex = index + 1;
+  std::vector<PartialName> resultList;
+  Name result;
+  for (const auto& item : m_nameFormat) {
+    auto it = std::find_if(params.begin(), params.end(),
+                           [&](const std::tuple<std::string, std::string>& e) { return std::get<0>(e) == item; });
+    if (it != params.end()) {
+      result.append(std::get<1>(*it));
     }
-    if (startIndex != factoryParam.size()) {
-        paramList.push_back(factoryParam.substr(startIndex));
+    else {
+      return resultList;
     }
-    return [paramList](const std::vector<std::tuple<std::string, std::string>> params){
-        if (params.size() > paramList.size() * 8) { // might be attack
-            BOOST_THROW_EXCEPTION(std::runtime_error("Too many extra parameters given"));
-        }
-        std::map<std::string, std::string> paramMap;
-        for (const auto& param : params) {
-            paramMap[std::get<0>(param)] = std::get<1>(param);
-            if (std::get<1>(param).size() == 0) { // empty parameter!
-                return std::vector<PartialName>();
-            }
-        }
-
-        //construct name
-        PartialName name;
-        for (const auto& field : paramList) {
-            auto it = paramMap.find(field);
-            if (it == paramMap.end()) {
-                return std::vector<PartialName>();
-            } else {
-                name.append(it->second);
-            }
-        }
-        std::vector<PartialName> nameList;
-        nameList.push_back(name);
-        return nameList;
-    };
+  }
+  resultList.push_back(std::move(result));
+  return resultList;
 }
 
-}
-}
+}  // namespace ndncert
+}  // namespace ndn
